Seaborn子锅-在折线图和条形图之间共享x轴

时间:2019-04-12 11:18:34

标签: python matplotlib seaborn

我正在尝试通过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轴视为分类或此类。

Example - wrong axis

是否有任何方法可以在两个图之间正确共享(数字)x轴?

谢谢

2 个答案:

答案 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()

enter image description here

答案 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))

应该使两个轴的范围和刻度位置显示相同

enter image description here