2012-07-24 18 views
35

So che i panda supportano un asse Y secondario, ma sono curioso se qualcuno conosce un modo per mettere un asse terziario Y su trame ... attualmente sto ottenendo questo con numpy + pyplot ... ma esso è lento con grandi set di dati.PANDAS trama più assi Y

questo è di tracciare diverse misurazioni con unità distinte sullo stesso grafico per un facile confronto (es umidità relativa/temperatura/e conducibilità elettrica)

quindi davvero solo curioso se qualcuno sa se questo è possibile in pandas senza troppo molto lavoro.

[Edit] Dubito che ci sia un modo per fare questo (senza troppo in testa) ma spero di essere smentiti, questa potrebbe essere una limitazione di matplotlib ...

risposta

55

penso che questo potrebbe funzionare :

import matplotlib.pyplot as plt 
import numpy as np 
from pandas import DataFrame 
df = DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C']) 

fig, ax = plt.subplots() 
ax3 = ax.twinx() 
rspine = ax3.spines['right'] 
rspine.set_position(('axes', 1.15)) 
ax3.set_frame_on(True) 
ax3.patch.set_visible(False) 
fig.subplots_adjust(right=0.7) 

df.A.plot(ax=ax, style='b-') 
# same ax as above since it's automatically added on the right 
df.B.plot(ax=ax, style='r-', secondary_y=True) 
df.C.plot(ax=ax3, style='g-') 

# add legend --> take advantage of pandas providing us access 
# to the line associated with the right part of the axis 
ax3.legend([ax.get_lines()[0], ax.right_ax.get_lines()[0], ax3.get_lines()[0]],\ 
      ['A','B','C'], bbox_to_anchor=(1.5, 0.5)) 

uscita:

Output

+0

questo è grande. ma abbiamo bisogno dell'ascia2? – goofd

+0

Utilizzando questo approccio ho avuto problemi con la legenda che si sovrapponeva. Questo mi ha aiutato: 'ax3.legend ([ax.get_lines() [0], ax2.get_lines() [0], ax3.get_lines() [0]], [label1 ',' label2 ',' label3 '] , bbox_to_anchor = (1.15, 0.5)) ' – tworec

+0

Ciao! Mi chiedo come aggiungere 'ylabel' per ogni asse? Grazie! –

Problemi correlati