Question Comment aligner la barre et la ligne dans le diagramme matplotlib à deux axes Y?


J'ai un pandas df comme ci-dessous:

>>> df
                   sales  net_pft  sales_gr  net_pft_gr
STK_ID RPT_Date                                        
600809 20120331  22.1401   4.9253    0.1824     -0.0268
       20120630  38.1565   7.8684    0.3181      0.1947
       20120930  52.5098  12.4338    0.4735      0.7573
       20121231  64.7876  13.2731    0.4435      0.7005
       20130331  27.9517   7.5182    0.2625      0.5264
       20130630  40.6460   9.8572    0.0652      0.2528
       20130930  53.0501  11.8605    0.0103     -0.0461

alors df[['sales','net_pft']].unstack('STK_ID').plot(kind='bar', use_index=True) créer un graphique à barres.

Et df[['sales_gr','net_pft_gr']].plot(kind='line', use_index=True) créer un graphique en courbes:

Maintenant, je veux les assembler dans un tableau de deux axes des ordonnées, en utilisant twinx ().

import matplotlib.pyplot as plt
fig = plt.figure()
ax = df[['sales','net_pft']].unstack('STK_ID').plot(kind='bar', use_index=True)
ax2 = ax.twinx()
ax2.plot(df[['sales_gr','net_pft_gr']].values, linestyle='-', marker='o', linewidth=2.0)

Le résultat est comme ceci: enter image description here

Mes problèmes sont:

  • Comment déplacer la ligne pour s'aligner avec la barre sur les mêmes x-tickers?
  • Comment laisser les tickers y_axis gauche et droit alignés sur la même ligne?

12
2017-11-13 11:16


origine


Réponses:


Changez simplement la dernière ligne en:

ax2.plot(ax.get_xticks(),df[['sales_gr','net_pft_gr']].values, linestyle='-', marker='o', linewidth=2.0)

Vous serez tous ensemble.

enter image description here

Je ne comprends pas très bien votre deuxième question. Les premier et deuxième axes y sont d’échelle différente, que voulez-vous dire en les alignant sur la même ligne? Ils ne peuvent pas être alignés sur la même ligne de grille (oui, vous pouvez le faire, mais l'axe droit aura l'air laid, avec des valeurs comme 0.687 et similaires). Quoi qu'il en soit, vous pouvez faire:

ax.set_ylim((-10, 80.))

pour les aligner, et l'intrigue semble maintenant laide:

enter image description here


7
2017-11-14 03:52