Tengo la siguiente trama:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
y ahora me gustaría dar a este gráfico etiquetas comunes del eje xy etiquetas del eje y. Con "común", quiero decir que debería haber una etiqueta grande del eje x debajo de la cuadrícula completa de subtramas, y una etiqueta grande del eje y a la derecha. No puedo encontrar nada sobre esto en la documentación plt.subplots
, y mis google sugieren que necesito hacer un gran plt.subplot(111)
comienzo, pero ¿cómo pongo mis subtramas 5 * 2 en ese uso plt.subplots
?
python
matplotlib
jolindbe
fuente
fuente
Respuestas:
Esto se parece a lo que realmente quieres. Aplica el mismo enfoque de esta respuesta a su caso específico:
fuente
plt.text
. Usted crea sus subtramas, pero luego agrega una gráfica de bits, la hace invisible y etiqueta sus x e y.tight_layout
?tight_layout
la sustitución0.04
con0
parece funcionar.fig.text
no es una buena idea. Esto arruina cosas comoplt.tight_layout()
Como lo considero relevante y lo suficientemente elegante (no es necesario especificar coordenadas para colocar texto), copio (con una ligera adaptación) una respuesta a otra pregunta relacionada .
Esto da como resultado lo siguiente (con matplotlib versión 2.2.0):
fuente
constrained_layout=True
porque crea etiquetas superpuestas. En este caso, debe ajustar manualmente los bordes de las subtramas.Sin
sharex=True, sharey=True
que consigas:Con él deberías hacerlo más agradable:
Pero si desea agregar etiquetas adicionales, debe agregarlas solo a los gráficos de borde:
Agregar etiqueta para cada gráfico lo estropearía (tal vez haya una manera de detectar automáticamente etiquetas repetidas, pero no estoy al tanto de una).
fuente
Desde el comando:
usó devuelve una tupla que consiste en la figura y una lista de las instancias de los ejes, ya es suficiente hacer algo como (tenga en cuenta que he cambiado
fig,ax
afig,axes
):Si desea cambiar algunos detalles en una subtrama específica, puede acceder a través de
axes[i]
dondei
itera sobre sus subtramas.También podría ser muy útil incluir un
al final del archivo, antes del
plt.show()
, para evitar la superposición de etiquetas.fuente
plt.subplots()
creará una nueva instancia de figura. Si desea seguir con este comando, puede agregar fácilmente unbig_ax = fig.add_subplot(111)
, ya que ya tiene una figura y puede agregar otro eje. Después de eso, puede manipularbig_ax
la forma en que se muestra en el enlace de Hooked.none
haciendo:big_ax.set_axis_bgcolor('none')
También debe hacer el color de la etiquetanone
(a diferencia del ejemplo vinculado por Hooked):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
en la declaraciónax.set_xlabel('Common x-label')
. ¿Puedes resolverlo?Se verá mejor si reserva espacio para las etiquetas comunes haciendo etiquetas invisibles para la subtrama en la esquina inferior izquierda. También es bueno pasar el tamaño de fuente de rcParams. De esta manera, las etiquetas comunes cambiarán de tamaño con la configuración de su rc, y los ejes también se ajustarán para dejar espacio para las etiquetas comunes.
fuente
Me encontré con un problema similar al trazar una cuadrícula de gráficos. Los gráficos constaban de dos partes (superior e inferior). Se suponía que la etiqueta y estaba centrada sobre ambas partes.
No quería usar una solución que dependiera de conocer la posición en la figura externa (como fig.text ()), por lo que manipulé la posición y de la función set_ylabel (). Por lo general, es 0.5, el medio del gráfico al que se agrega. Como el relleno entre las partes (hspace) en mi código era cero, pude calcular el medio de las dos partes en relación con la parte superior.
imagen
Desventajas:
La distancia horizontal al gráfico se basa en la parte superior, las marcas inferiores pueden extenderse a la etiqueta.
La fórmula no tiene en cuenta el espacio entre las partes.
Lanza una excepción cuando la altura de la parte superior es 0.
Probablemente haya una solución general que tenga en cuenta el relleno entre las figuras.
fuente
Actualizar:
Esta característica ahora es parte del paquete proplot matplotlib que lancé recientemente en pypi. Por defecto, cuando crea figuras, las etiquetas se "comparten" entre los ejes.
Respuesta original:
Descubrí un método más robusto:
Si conoce los
bottom
ytop
kwargs que entraron en unaGridSpec
inicialización, o conoce las posiciones de los bordes de sus ejes enFigure
coordenadas , también puede especificar la posición de la etiqueta enFigure
coordenadas con un poco de magia de "transformación". Por ejemplo:... y debería ver que la etiqueta todavía se ajusta adecuadamente de izquierda a derecha para evitar que se superpongan con las etiquetas, como de costumbre, pero ahora se ajustará para estar siempre exactamente entre las subtramas deseadas.
Además, si ni siquiera lo usa
set_position
, la etiqueta aparecerá por defecto exactamente a la mitad de la figura . Supongo que esto se debe a que cuando la etiqueta finalmente se dibuja,matplotlib
usa 0.5 para lay
coordenada sin verificar si la transformación de coordenadas subyacente ha cambiado.fuente