我正在尝试通过Seaborn在Juyter实验室笔记本中创建2个堆积图;其中一个是折线图,另一个是条形图。两者应该共享相同的x轴。
%matplotlib widget
dt = pd.DataFrame.from_dict({'column_x': range(-10,10), 'vals_1': range(10,30), 'vals_2':range(30,50)})
f, axarr = plt.subplots(2, sharex=True)
sns.lineplot(x="column_x", y="vals_1", data=dt, marker="o", ax=axarr[0])
sns.barplot(x="column_x", y="vals_2", data=dt, ax=axarr[1])
问题是-这似乎并没有实际共享轴。我不确定为什么,最好的选择是条形图将其x轴视为分类或此类。
是否有任何方法可以在两个图之间正确共享(数字)x轴?
谢谢
答案 0 :(得分:2)
lineplot
是数字图,而barplot
是分类图。您可能希望将lineplot
替换为pointplot
,这也是一个分类图。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
dt = pd.DataFrame.from_dict({'column_x': range(-10,10), 'vals_1': range(10,30), 'vals_2':range(30,50)})
f, axarr = plt.subplots(2, sharex=True)
sns.pointplot(x="column_x", y="vals_1", data=dt, marker="o", ax=axarr[0])
sns.barplot(x="column_x", y="vals_2", data=dt, ax=axarr[1])
plt.show()
答案 1 :(得分:1)
您是正确的,seaborn在绘制条形图时将x值视为分类的。
来自docs:
即使数据具有数字或日期类型,此函数也始终将变量之一视为分类变量,并在相关轴的序数位置(0、1,…n)绘制数据。
因此,我认为最简单的方法可能是关闭sharex
并自己滚动:
axarr[0].set_xlim(dt['column_x'].min()-0.5, dt['column_x'].max()+0.5)
axarr[0].xaxis.set_major_locator(ticker.MultipleLocator(1))
应该使两个轴的范围和刻度位置显示相同