Горизонтальная столбчатая гистограмма в Matplotlib

Я пытаюсь создать горизонтальную столбчатую гистограмму с помощью matplotlib но я не вижу, как сделать бары на самом деле стеком, а не все начинаются на оси y.

вот мой тестовый код.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plot_chart(df, fig, ax)
ind = arange(df.shape[0])      
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00')
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00')
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0')
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0')
plt.show()

изменить так, чтобы использовать left кварг после просмотра комментария tcaswell.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plot_chart(df, fig, ax)
ind = arange(df.shape[0])      
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00')
lefts = df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts)
lefts = lefts + df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts)
lefts = lefts + df['EndUse_91_1.0']
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts)
plt.show()

это кажется правильным подходом, но он терпит неудачу, если нет данных для конкретного бара, поскольку он пытается добавить nan к значению, которое затем возвращает nan.

5 ответов


Так как вы используете панд, стоит отметить, что вы можете делать штабелированные гистограммы изначально:

df2.plot(kind='bar', stacked=True)

посмотреть


вот решение, хотя я уверен, что должен быть лучший способ сделать это. The series.fillna(0) часть заменяет любой nan С 0.

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plot_chart(df, fig, ax)
ind = arange(df.shape[0])      
ax.barh(ind, df['EndUse_91_1.0'], color='#FFFF00')
lefts = df['EndUse_91_1.0'].fillna(0)
ax.barh(ind, df['EndUse_91_nan'], color='#FFFF00', left=lefts)
lefts = lefts + df['EndUse_91_1.0'].fillna(0)
ax.barh(ind, df['EndUse_80_1.0'], color='#0070C0', left=lefts)
lefts = lefts + df['EndUse_91_1.0'].fillna(0)
ax.barh(ind, df['EndUse_80_nan'], color='#0070C0', left=lefts)
plt.show()

в качестве примечания вы можете обернуть повторяющийся код в цикл через:

data_lst = [df['EndUse_91_1.0'], ..]
color_lst = ["FFFF00", ..]
left = 0
for data, color in zip(data_lst, color_lst):
    ax.barh(ind, data, color=color, left=left)
    left += data

по модулю данные-санитария


был еще один хороший ответ, здесь, в переполнении стека. Он рисует Hbars при добавлении в список! перейти к ответу.

Other post's solution.


его также можно (и очень легко) просто элемент мудрый добавить все элементы с помощью Map и add operator. Как уже ответили в вопросе элементное добавление 2 списков в Python?. Или просто используйте массив numpy.