我曾多次以不同的方式陷入这个 Pandas 陷阱。这次,我想使用来自两个单独数据帧的数据绘制两个条形图,一个在另一个之上,但每个图都有一个共同的 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 轴的标签只是底部图中的标签。
解决这个问题的一种方法是外部连接两个数据框,然后绘制每一列。 (经过反射(reflection),此解决方案类似于 #gyx-hh 在 Plotting Pandas data as an array of bar chart does not honour sharex = True 给出的答案。)外部连接数据帧有效,但无论是否设置 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
我真的很喜欢 pandas.plot()
方法,但对我来说,这是一个非常严重的故障,可能会导致数据被误解。这是否应该作为 pandas 团队的错误提出,或者是否有理由认为这种行为更可取?
最佳答案
为了验证您的观察,我认为这很困惑。
对齐
这本质上与您的加入
做同样的事情。
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')
关于python - 将单独的 Pandas 数据框绘制为具有共享 x 轴的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655084/