Seaborn中同一图中的线图和表示图

问题描述

我想在seaborn中绘制同一图中的两个数据集,但这是行不通的。

我的代码

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

x = np.arange(1,36)
x2 =[5,5,10,20,30,30]

y = [6431,6449,6466,6483,6499,6515,6530,6545,6559,6572,6586,6599,6605,6605]

y2 = [6437,6513,6540,6472,6635,6534,6532,6579,6575,6509,6660,6693,6520,6691,6580,6627]

df1 = {'x': x,'y': y}
df2 = {'x': x2,'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

fig,ax = plt.subplots(figsize=(10,6.68))

sns.set(style="ticks",font='arial',font_scale=2)

sns.lineplot(x="x",y="y",palette = 'PuBuGn_d',ax=ax,data=df1)
sns.relplot(x="x",palette = 'cmap',ax = ax,data=df2)

plt.show()

它看起来应该像:

enter image description here

是否可以使用千位分隔符来格式化y轴?

解决方法

sns.relplotfigure-level function。这意味着它可能为列的各种组合创建许多子图。因此,即使只需要一个子图,它也总是创建自己的图形。用基础的scatterplot替换relplot可解决此问题。

要获得千位分隔符,可以将FuncFormatter与将数字转换为带有komma in the format的字符串的函数一起使用。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import pandas as pd

sns.set_style("whitegrid")
x = np.arange(1,36)
x2 = [5,5,10,20,30,30]
y = [6431,6449,6466,6483,6499,6515,6530,6545,6559,6572,6586,6599,6605,6605]
y2 = [6437,6513,6540,6472,6635,6534,6532,6579,6575,6509,6660,6693,6520,6691,6580,6627]

df1 = {'x': x,'y': y}
df2 = {'x': x2,'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

fig,ax = plt.subplots(figsize=(10,6.68))

sns.set(style="ticks",font='arial',font_scale=2)

sns.lineplot(x="x",y="y",palette='PuBuGn_d',ax=ax,data=df1)
sns.scatterplot(x="x",color='orange',data=df2,s=150)
ax.yaxis.set_major_formatter(FuncFormatter(lambda x,p: f'{x:,.0f}'))

plt.tight_layout()
plt.show()

example plot

,

这是一个潜在的解决方法。切换sns.relplotsns.lineplot的位置可得到所需的输出:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

x = np.arange(1,36)
x2 =[5,30]

y = [6431,6605]

y2 = [6437,'y': y2}

df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)

sns.set(style="ticks",font_scale=1)

sns.relplot(x="x",data=df2)
sns.lineplot(x="x",data=df1)

plt.show()

输出:

enter image description here