2012-07-24 14 views
35

Sé que los pandas soportan un eje Y secundario, pero tengo curiosidad si alguien sabe cómo poner un eje Y terciario en las parcelas ... Actualmente estoy logrando esto con numpy + pepplot ... pero es lento con grandes conjuntos de datos.PANDAS traza múltiples ejes Y

esto es para trazar diferentes mediciones con unidades distintas en la misma gráfica para facilitar la comparación (por ejemplo, humedad relativa/temperatura/y conductividad eléctrica)

así que realmente sólo curiosidad si alguien sabe si esto es posible en pandas sin demasiado mucho trabajo.

[Editar] Dudo que hay una manera de hacer esto (sin demasiada sobrecarga), sin embargo espero estar equivocado, esto puede ser una limitación de matplotlib ...

Respuesta

55

creo que esto podría funcionar :

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)) 

salida:

Output

+0

esto es muy bueno. pero, ¿necesitamos el ax2? – goofd

+0

Usando este enfoque tuve un problema con la leyenda que se superponía. Esto me ayudó: '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

¡Hola! Me pregunto cómo agregar 'ylabel' para cada eje? ¡Gracias! –

Cuestiones relacionadas