Skip to content Skip to sidebar Skip to footer

Plotting Stacked Bars With A Total Line And Dates On Xlabels

I am using the pandas plot to generate a stacked bar chart, which has a different behaviour from matplotlib's, but the dates always come out with a bad format and I could not chang

Solution 1:

Is this what you want:

fig, ax = plt.subplots(1,1, figsize=(16,9))
# PLOTTING
ax.bar(df.index, df['price ex sa'], bottom=df['quantum ex sa'],width=31, label='price ex sa')
ax.bar(df.index, df['quantum ex sa'], width=31, label='quantum ex sa')

total = df.sum(axis=1)
ax.plot(total.index, total, color='r', linewidth=3, label='total')

ax.legend()
plt.show()

enter image description here

Edit: There seems to be a bug (features) on plotting with datetime. I tried to convert the index to string and it works:

df.index=df.index.strftime('%Y-%m')

ax = df.plot(kind='bar', stacked=True, width=1)
df['Total'] = df.sum(axis=1)
df['Total'].plot(ax=ax, label='total')
ax.legend()

enter image description here


Edit 2: I think I know what's going on. The problem is that

ax = df.plot(kind='bar', stacked=True)

returns/sets x-axis of ax to range(len(df)) labeled by the corresponding values from df.index, but not df.index itself. That's why if we plot the second series on the same ax, it doesn't show (due to different scale of xaxis). So I tried:

# PLOTTING
colums = df.columns

ax = df.plot(kind='bar', stacked=True, width=1, figsize=(10, 6))
ax.plot(range(len(df)), df.sum(1), label='Total')
ax.legend()
plt.show()

and it works as expected

enter image description here


Post a Comment for "Plotting Stacked Bars With A Total Line And Dates On Xlabels"