使用共享x轴将单独的Pan​​das数据框绘制为条形图

时间:2019-02-12 16:57:50

标签: python pandas plot

我已经以不同的面貌多次陷入这个熊猫陷阱。在这种情况下,我想使用两个独立数据帧中的数据绘制两个条形图,一个在另一个之上,但每个图都有一个公共的x轴。

我有两个数据框,如下所示:

dfA = pd.DataFrame({'year':[2003,2004,2005,2006,2007],
                    'value':[75,84,95,101,119]})

dfA = dfA.set_index('year')

dfB = pd.DataFrame({'year':[2000,2001,2002,2003,2004,2005],
                    'value':[34,46,64,71,88,93]})

dfB = dfB.set_index('year')

数据框显示为:

      value
year       
2003     75
2004     84
2005     95
2006    101
2007    119

      value
year       
2000     34
2001     46
2002     64
2003     71
2004     88
2005     93

然后我尝试按以下方式绘制图形:

fig, axarr = plt.subplots(2,
                          figsize = (4,6),
                          sharex = True)

dfA['value'].plot(kind = 'bar',
                  ax = axarr[0],
                  sharex = True,
                  title = 'DF A')

dfB['value'].plot(kind = 'bar',
                  ax = axarr[1],
                  sharex = True,
                  title = 'DF B')

plt.show()

生成的图形显示正确的钢筋高度,但是x轴显然没有共享,而是条形似乎是一个接一个地绘制,并与左手栏对齐; x轴使用的标签只是底部图中的标签。 Bar-plots from different dataframes

一种解决方法是外部连接两个数据框,然后绘制每列。 (在反思中,此解决方案与Plotting Pandas data as an array of bar chart does not honour sharex = True处的#gyx-hh给出的答案类似。)外部连接数据帧有效,但无论是否设置了sharex = True,它都有效,因为完整的值集为每个数据集都存在,即使某些单元格可能包含NaN。

dfC = dfA.join(dfB,
               how = 'outer',
               lsuffix = '_A',
               rsuffix = '_B')

      value_A  value_B
year                  
2000      NaN     34.0
2001      NaN     46.0
2002      NaN     64.0
2003     75.0     71.0
2004     84.0     88.0
2005     95.0     93.0
2006    101.0      NaN
2007    119.0      NaN

Bar-plot with correct x axis

我真的很喜欢pandas.plot()方法,但是对我来说,这是一个非常严重的故障,可能导致数据被误解。应该将其作为熊猫团队的错误来提出吗?还是有这种行为可取的原因?

1 个答案:

答案 0 :(得分:1)

为验证您的观察,我认为这很糟。

align

这实际上与您的join做同样的事情。

fig, axarr = plt.subplots(2, figsize=(4,6), sharex=True)

# vvv Thing I Added vvv
dfA, dfB = dfA.align(dfB, axis=0)

dfA['value'].plot.bar(ax=axarr[0], title='DF A')
dfB['value'].plot.bar(ax=axarr[1], title='DF A')

enter image description here

相关问题