将熊猫数据绘制为条形图数组不符合sharex = True

时间:2019-01-23 12:30:09

标签: python pandas plot bar-chart

我有一个Pandas数据框,其中包含一个包含“年份”数据的列和一个包含“计数”数据的列。还有一列包含“类别”变量。并非每个类别都有每年的数据。我想使用一个公共的x轴(年)绘制一组条形图,一个在另一个上。我写的代码几乎可以用,除了x轴并非在所有绘图中都通用。

下面给出代码示例。基本上,代码创建了一个sharex = True的轴数组,然后逐步遍历每个轴,从数据框中绘制相关数据。

# Define dataframe
myDF = pd.DataFrame({'year':list(range(2000,2010))+list(range(2001,2008))+list(range(2005,2010)),
                     'category':['A']*10 + ['B']*7 + ['C']*5,
                     'count':[2,3,4,3,4,5,4,3,4,5,2,3,4,5,4,5,6,9,8,7,8,6]})

# Plot counts for individual categories in array of bar charts
fig, axarr = plt.subplots(3, figsize = (4,6), sharex = True)

for i in range(0,len(myDF['category'].unique())):
    myDF.loc[myDF['category'] == myDF['category'].unique()[i],['year','count']].plot(kind = 'bar',
                                                                                     ax = axarr[i],
                                                                                     x = 'year',
                                                                                     y = 'count',
                                                                                     legend = False,
                                                                                     title = 'Category {0} bar chart'.format(myDF['category'].unique()[i]))

fig.subplots_adjust(hspace=0.5)

plt.show()

以下是结果的屏幕截图:

enter image description here

我期望A类钢筋从2000年扩展到2009年,B类钢筋从2001年扩展到2007年,C类钢筋从2005年扩展到2009年。但是,似乎每个类别的前5个钢筋不管x轴上的值如何,都将绘制它们。据推测,之所以只绘制5条柱形图,是因为最后一个类别仅具有5年的数据。更大的问题是,针对其他类别绘制的数据未针对正确的年份绘制。我一直在寻找解决方案,并尝试了各种修改,但似乎没有任何效果。

任何欢迎您解决此问题的建议。

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

d = myDF.groupby(['year', 'category'])['count'].sum().unstack()

fig, axarr = plt.subplots(3, figsize = (4,6), sharex=True)
for i, cat in enumerate(d.columns):
    d[cat].plot(kind='bar', ax=axarr[i], title='Category {cat} bar chart'.format(cat=cat))

fig.subplots_adjust(hspace=0.5)