web-dev-qa-db-fra.com

Modifiez la largeur des barres à l'aide de la fonction dataframe.plot () dans matplotlib

Je fais un graphique à barres empilées en utilisant:

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

Je veux contrôler la largeur des barres afin que les barres soient connectées les unes aux autres comme un histogramme.

J'ai parcouru la documentation mais en vain - des suggestions? Est-il possible de le faire de cette façon?

33
Osmond Bishop

Pour tous ceux qui rencontrent cette question:

Depuis pandas 0,14, le traçage avec des barres a une commande 'width': https://github.com/pydata/pandas/pull/6644

L'exemple ci-dessus peut maintenant être résolu simplement en utilisant

df.plot(kind='bar', stacked=True, width=1)
63
Murkbeard

Si vous pensez que vous devez "post-traiter" le barplot avec matplotlib comme pandas définit en interne la largeur des barres.

Les rectangles qui forment les barres se trouvent dans des objets conteneurs. Vous devez donc parcourir ces conteneurs et définir la largeur des rectangles individuellement:

In [208]: df = pd.DataFrame(np.random.random((6, 5)) * 10,               
                        index=list('abcdef'), columns=list('ABCDE'))

In [209]: df
Out[209]: 
     A    B    C    D    E
a  4.2  6.7  1.0  7.1  1.4
b  1.3  9.5  5.1  7.3  5.6
c  8.9  5.0  5.0  6.7  3.8
d  5.5  0.5  2.4  8.4  6.4
e  0.3  1.4  4.8  1.7  9.3
f  3.3  0.2  6.9  8.0  6.1

In [210]: ax = df.plot(kind='bar', stacked=True, align='center')

In [211]: for container in ax.containers:
              plt.setp(container, width=1)
   .....:         

In [212]: x0, x1 = ax.get_xlim()

In [213]: ax.set_xlim(x0 -0.5, x1 + 0.25)
Out[213]: (-0.5, 6.5)

In [214]: plt.tight_layout()

stacked_bar.png

15
bmu