问题描述
我想在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()
是否可以使用千位分隔符来格式化y轴?
解决方法
sns.relplot
是figure-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()
,
这是一个潜在的解决方法。切换sns.relplot
和sns.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()
输出: