Tengo una trama con dos ejes y, usando twinx()
. También le doy etiquetas a las líneas y quiero mostrarlas legend()
, pero solo consigo obtener las etiquetas de un eje en la leyenda:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Entonces solo obtengo las etiquetas del primer eje en la leyenda, y no la etiqueta 'temp' del segundo eje. ¿Cómo podría agregar esta tercera etiqueta a la leyenda?
python
matplotlib
axis
legend
joris
fuente
fuente
ax
con el estilo que uso enax2
: en su caso,ax.plot([], [], '-r', label = 'temp')
. Es mucho más rápido y sencillo que hacerlo correctamente ...Respuestas:
Puede agregar fácilmente una segunda leyenda agregando la línea:
Obtendrás esto:
Pero si desea todas las etiquetas en una leyenda, debe hacer algo como esto:
Lo que te dará esto:
fuente
errorbar
tramas. Para obtener una solución que los maneje correctamente, consulte a continuación: stackoverflow.com/a/10129461/1319447ax1
. En este caso, utilicelns1=ax1.lines
y luego agreguelns2
a esta lista.loc
se explican aquíNo estoy seguro de si esta funcionalidad es nueva, pero también puede usar el método get_legend_handles_labels () en lugar de realizar un seguimiento de las líneas y las etiquetas usted mismo:
fuente
errorbar
gráficas, mientras que la aceptada falla (mostrando una línea y sus barras de error por separado, y ninguna de ellas con la etiqueta correcta). Además, es más simple.ax2
y no tiene un conjunto desde el principioDesde matplotlib versión 2.1 en adelante, puede usar una leyenda de figura . En lugar de
ax.legend()
, que produce una leyenda con los mangos de los ejesax
, se puede crear una leyenda de figuraque reunirá todos los identificadores de todas las subtramas de la figura. Dado que es una leyenda de figura, se colocará en la esquina de la figura, y el
loc
argumento es relativo a la figura.Para volver a colocar la leyenda en los ejes, uno debería suministrar ay
bbox_to_anchor
abbox_transform
. El último sería la transformación de los ejes de los ejes en los que debería residir la leyenda. El primero puede ser las coordenadas del borde definidas por las coordenadas de losloc
ejes.fuente
conda upgrade matplotlib
no encontré nuevas versiones, todavía estoy usando v.2.0.2Puede obtener fácilmente lo que desea agregando la línea en ax:
o
Esto no trazaría nada más que agregar una etiqueta a la leyenda de ax.
Creo que esta es una manera mucho más fácil. No es necesario rastrear líneas automáticamente cuando solo tiene unas pocas líneas en los segundos ejes, ya que la fijación a mano como la anterior sería bastante fácil. De todos modos, depende de lo que necesites.
El código completo es el siguiente:
La trama es la siguiente:
Actualización: agregue una versión mejor:
Esto no hará nada mientras
plot(0, 0)
pueda cambiar el rango del eje.Un ejemplo extra para dispersión
fuente
Un truco rápido que puede satisfacer tus necesidades.
Retire el marco de la caja y coloque manualmente las dos leyendas una al lado de la otra. Algo como esto..
Donde la tupla loc es porcentajes de izquierda a derecha y de abajo hacia arriba que representan la ubicación en el gráfico.
fuente
Encontré un siguiente ejemplo oficial de matplotlib que usa host_subplot para mostrar múltiples ejes y y todas las diferentes etiquetas en una leyenda. No hay solución alternativa necesaria. La mejor solución que encontré hasta ahora. http://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html
fuente