python - 将单独的 Pandas 数据框绘制为具有共享 x 轴的条形图

标签 python pandas plot

我曾多次以不同的方式陷入这个 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 轴的标签只是底部图中的标签。 Bar-plots from different dataframes

解决这个问题的一种方法是外部连接两个数据框,然后绘制每一列。 (经过反射(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

Bar-plot with correct x axis

我真的很喜欢 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')

enter image description here

关于python - 将单独的 Pandas 数据框绘制为具有共享 x 轴的条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655084/

相关文章:

python - 如何优化这个Python脚本?

python - 如何优雅地找到 Python 枚举中的下一个和上一个值?

python - Pandas:当组中的值落在某个范围内时,将组保留在数据中

python - 如何使用 url_for 读取 templates 文件夹中的文件?

python - 如何操作 pandas 中的行 block

python - 计算 pandas 数据帧的百分位并将二进制值分配给新列

python - 被 pandas 条件和/或 boolean 索引难住了

r - 控制R中ggplot2中scale_colour_gradient的刻度限制和方向?

r - 在 R 中的简单 X-Y 图上叠加椭圆

matlab - 更改 Matlab 默认的 x 限制行为