Bootstrapping quelque chose de rapide pour tracer plusieurs y-axes partageant un axe des x en utilisant @joe-kington's réponse :
# d = Pandas Dataframe,
# ys = [ [colonnes dans le même y], [colonnes dans le même y], [colonnes dans le même y], .. ]
def graphique(d,ys):
from itertools import cycle
fig, ax = plt.subplots()
axes = [ax]
pour y in ys[1:]:
# Jumeler l'axe des x deux fois pour créer des y-axes indépendants.
axes.append(ax.twinx())
extra_ys = len(axes[2:])
# Faire de la place sur le côté droit pour les y-axes supplémentaires.
si extra_ys > 0:
temp = 0.85
si extra_ys <= 2:
temp = 0.75
elif extra_ys <= 4:
temp = 0.6
si extra_ys > 5:
print 'tu es ridicule'
fig.subplots_adjust(right=temp)
right_additive = (0.98-temp)/float(extra_ys)
# Déplacer l'épine du dernier y-axis vers la droite par x% de la largeur des axes
i = 1.
for ax in axes[2:]:
ax.spines['right'].set_position(('axes', 1.+right_additive*i))
ax.set_frame_on(True)
ax.patch.set_visible(False)
ax.yaxis.set_major_formatter(matplotlib.ticker.OldScalarFormatter())
i +=1.
# Pour rendre la bordure de l'axe le plus à droite visible, nous devons activer le cadre
# sur. Cela masque les autres tracés, cependant, nous devons désactiver son remplissage.
cols = []
lignes = []
styles_de_ligne = cycle(['-','-','-', '--', '-.', ':', '.', ',', 'o', 'v', '^', '<', '>',
'1', '2', '3', '4', 's', 'p', '*', 'h', 'H', '+', 'x', 'D', 'd', '|', '_'])
couleurs = cycle(matplotlib.rcParams['axes.color_cycle'])
pour ax,y in zip(axes,ys):
ls=styles_de_ligne.next()
si len(y)==1:
col = y[0]
cols.append(col)
couleur = couleurs.next()
lignes.append(ax.plot(d[col],linestyle=ls,label=col,color=couleur))
ax.set_ylabel(col,color=couleur)
#ax.tick_params(axis='y', colors=color)
ax.spines['right'].set_color(couleur)
sinon:
pour col in y:
couleur = couleurs.next()
lignes.append(ax.plot(d[col],linestyle=ls,label=col,color=couleur))
cols.append(col)
ax.set_ylabel(', '.join(y))
#ax.tick_params(axis='y')
axes[0].set_xlabel(d.index.name)
lns = lignes[0]
pour l in lignes[1:]:
lns +=l
labs = [l.get_label() pour l in lns]
axes[0].legend(lns, labs, loc=0)
plt.show()