Estoy trazando el mismo tipo de información, pero para diferentes países, con múltiples subtramas con matplotlib. Es decir, tengo 9 parcelas en una cuadrícula de 3x3, todas con las mismas líneas (por supuesto, diferentes valores por línea).
Sin embargo, no he descubierto cómo poner una sola leyenda (ya que las 9 subtramas tienen las mismas líneas) en la figura solo una vez.
¿Cómo puedo hacer eso?
python
matplotlib
Pocketfullofcheese
fuente
fuente
handles, labels = [(a + b) for a, b in zip(ax1.get_legend_handles_labels(), ax2.get_legend_handles_labels())]
figlegend puede ser lo que estás buscando: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend
Ejemplo aquí: http://matplotlib.org/examples/pylab_examples/figlegend_demo.html
Otro ejemplo:
o:
fuente
lines
variable para poner en el argumentolegend
?lines
es una lista de resultados que se devuelvenaxes.plot()
(es decir, cadaaxes.plot
rutina o una rutina similar devuelve una "línea"). Ver también el ejemplo vinculado.Para el posicionamiento automático de una sola leyenda en un
figure
con muchos ejes, como los obtenidos consubplots()
, la siguiente solución funciona muy bien:Con
bbox_to_anchor
ybbox_transform=plt.gcf().transFigure
está definiendo un nuevo cuadro delimitador del tamaño de sufigure
para ser una referencialoc
. Usando(0,-0.1,1,1)
mueve este cuadro de bouding ligeramente hacia abajo para evitar que la leyenda se coloque sobre otros artistas.OBS: use esta solución DESPUÉS de usar
fig.set_size_inches()
y ANTES de usarfig.tight_layout()
fuente
loc='upper center', bbox_to_anchor=(0.5, 0), bbox_transform=plt.gcf().transFigure
y no se superpondrá con seguridad.Solo tienes que pedir la leyenda una vez, fuera de tu circuito.
Por ejemplo, en este caso tengo 4 subtramas, con las mismas líneas y una sola leyenda.
fuente
figlegend
, como sugiere Evert, parece ser una solución mucho mejor;)fig.legend()
es que requiere la identificación de todas las líneas (tramas) ... ya que, para cada subtrama, estoy usando un bucle para generar las líneas, la única solución que descubrí para superar esto es crear una lista vacía antes el segundo ciclo, y luego agregue las líneas a medida que se crean ... Luego uso esta lista como argumento de lafig.legend()
función.dados
haydados
había un conjunto de datos de un archivo netCDF4 (para cada uno de los archivos definidos en la listaficheiros
). En cada bucle, se lee un archivo diferente y se agrega una subtrama a la figura.He notado que ninguna respuesta muestra una imagen con una sola leyenda que hace referencia a muchas curvas en diferentes subtramas, así que tengo que mostrarle una ... para que tenga curiosidad ...
Ahora, quieres mirar el código, ¿no?
Las dos lineas
Merecen una explicación: para este objetivo, he encapsulado la parte difícil en una función, solo 4 líneas de código, pero muy comentado
PD: Reconozco que
sum(list_of_lists, [])
es un método realmente ineficiente para aplanar una lista de listas, pero love Me encanta su tamaño compacto, ② generalmente hay algunas curvas en algunas subtramas y ③ ¿Matplotlib y eficiencia? ;-)fuente
Si bien es bastante tarde para el juego, daré otra solución aquí, ya que este sigue siendo uno de los primeros enlaces en aparecer en Google. Usando matplotlib 2.2.2, esto se puede lograr usando la función gridspec. En el ejemplo a continuación, el objetivo es tener cuatro subtramas organizadas de forma 2x2 con la leyenda que se muestra en la parte inferior. Se crea un eje 'falso' en la parte inferior para colocar la leyenda en un lugar fijo. El eje 'falso' se apaga, por lo que solo se muestra la leyenda. Resultado: https://i.stack.imgur.com/5LUWM.png .
fuente
si está utilizando subtramas con gráficos de barras, con diferentes colores para cada barra. puede ser más rápido crear los artefactos usted mismo usando
mpatches
Digamos que tiene cuatro barras con diferentes colores, ya
r
m
c
k
que puede establecer la leyenda de la siguiente manerafuente
plt.legend
tener una leyenda para todas mis subtramashandles, _ = plt.gca().get_legend_handles_labels()
luegofig.legend(handles, labels)
Esta respuesta es un complemento de @ Evert en la posición de leyenda.
Mi primer intento con la solución de @ Evert falló debido a la superposición de la leyenda y el título de la subtrama.
De hecho, las superposiciones son causadas por
fig.tight_layout()
, lo que cambia el diseño de las subtramas sin tener en cuenta la leyenda de la figura. Sin embargo,fig.tight_layout()
es necesario.Para evitar las superposiciones, podemos decir
fig.tight_layout()
que deje espacios para la leyenda de la figurafig.tight_layout(rect=(0,0,1,0.9))
.Descripción de los parámetros tight_layout () .
fuente
Para construir sobre la respuesta de @ gboffi y Ben Usman:
En una situación en la que uno tiene diferentes líneas en diferentes subtramas con el mismo color y etiqueta, uno puede hacer algo en la línea de
fuente