Отображение данных Pandas в виде массива гистограммы не учитывает sharex = True - PullRequest
0 голосов
/ 23 января 2019

У меня есть фрейм данных Pandas, который содержит столбец с данными 'year' и столбец с данными 'count'. Существует также столбец, содержащий переменную категории. Не в каждой категории есть данные за каждый год. Я хотел бы построить массив гистограмм, один над другим, используя общую ось х (год). Код, который я написал, почти работает, за исключением оси 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 баров каждой категории строятся независимо от значения на оси х. Предположительно, причина построения только 5 баров в том, что в последней категории были данные только за 5 лет. Еще большая проблема заключается в том, что данные, представленные для других категорий, не сопоставлены с правильным годом. Я искал решения и пробовал различные модификации, но, похоже, ничего не работает.

Любые предложения по решению этой проблемы будут приветствоваться.

1 Ответ

0 голосов
/ 23 января 2019

Попробуйте следующий подход:

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)
...