首页 > 解决方案 > 两个数据帧在多个子图中一起广播

问题描述

我想绘制 5 个不同的子图,一个用于每一年的数据。对于每一年,我想展示每个县的 DEM 和 REP。到目前为止,我已经编写了以下代码:

fig = plt.figure(figsize=(13,10))

plt.subplot(3, 2, 1)
plt.bar(data=districts_2018[['DEM', 'REP']], 
        x=districts_2018.index, 
        height=(districts_2018[['DEM', 'REP']]))

plt.subplot(3, 2, 2)
plt.bar(data=districts_2017[['DEM', 'REP']], 
        x=districts_2017.index, 
        height=districts_2017['DEM'])

plt.subplot(3, 2, 3)
plt.bar(data=districts_2016[['DEM', 'REP']], 
        x=districts_2016.index, 
        height=districts_2016['DEM'])

plt.subplot(3, 2, 4)
plt.bar(data=districts_2015[['DEM', 'REP']], 
        x=districts_2015.index, 
        height=districts_2015['DEM'])

plt.subplot(3, 2, 5)
plt.bar(data=districts_2014[['DEM', 'REP']], 
        x=districts_2014.index, 
        height=districts_2014['DEM'])

plt.tight_layout();

但是,与第一个子图 (3,2,1) 的情况一样,我收到错误: ValueError: shape mismatch: objects cannot be broadcast to a single shape. 如果我只将高度设置为districts_2018['DEM']但仅显示 DEM 而不是 REP,则此代码有效。

标签: pythonpandasmatplotlibplot

解决方案


您可以直接使用 pandas 包装器来绘制分组条形图。将 设置ax为您希望该图出现的相应子图。

fig, axes = plt.subplots(3,2,figsize=(13,10))
for ax, df in zip(axes.flat, [districts_2018, districts_2017, ....])
    df[['DEM', 'REP']].plot.bar(ax=ax)

推荐阅读