Jennifer
Jennifer

Reputation: 41

Shift bar locations on multi-bar bar plot

much searching has not yielded a working solution to a python matplotlib problem. I'm sure I'm missing something simple...

MWE:

import pandas as pd
import matplotlib.pyplot as plt

#MWE plot
T = [1, 2, 3, 4, 5, 6]
n = len(T)
d1 = list(zip([500]*n, [250]*n))
d2 = list(zip([250]*n, [125]*n))

df1 = pd.DataFrame(data=d1, index=T)
df2 = pd.DataFrame(data=d2, index=T)

fig = plt.figure()
ax = fig.add_subplot(111)

df1.plot(kind='bar', stacked=True, align='edge', width=-0.4, ax=ax)
df2.plot(kind='bar', stacked=True, align='edge', width=0.4, ax=ax)    
plt.show()

Generates: Shifted Plot

No matter what parameters I play around with, that first bar is cut off on the left. If I only plot a single bar (i.e. not clusters of bars), the bars are not cut off and in fact there is nice even white space on both sides.

I hard-coded the data for this MWE; however, I am trying to find a generic way to ensure the correct alignment since I will likely produce a LOT of these plots with varying numbers of items on the x axis and potentially a varying number of bars in each cluster.

How do I shift the bars so that the they are spaced correctly on the x axis with even white space?

Upvotes: 1

Views: 3186

Answers (1)

user11979350
user11979350

Reputation:

It all depends on the width that you put in your plots. Put some xlim.

import pandas as pd
import matplotlib.pyplot as plt

#MWE plot
T = [1, 2, 3, 4, 5, 6]
n = len(T)
d1 = list(zip([500]*n, [250]*n))
d2 = list(zip([250]*n, [125]*n))

df1 = pd.DataFrame(data=d1, index=T)
df2 = pd.DataFrame(data=d2, index=T)

fig = plt.figure()
ax = fig.add_subplot(111)

df1.plot(kind='bar', stacked=True, align='edge', width=-0.4, ax=ax)
df2.plot(kind='bar', stacked=True, align='edge', width=0.4, ax=ax)   
plt.xlim(-.4,5.4) 
plt.show()

Example

Hope it works!

Upvotes: 1

Related Questions