Puede crear una subtrama grande que cubra las dos subtramas y luego establecer las etiquetas comunes.
import random
import matplotlib.pyplot as plt
x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]
fig = plt.figure()
ax = fig.add_subplot(111) # The big subplot
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
# Turn off axis lines and ticks of the big subplot
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelcolor='w', top=False, bottom=False, left=False, right=False)
ax1.loglog(x, y1)
ax2.loglog(x, y2)
# Set common labels
ax.set_xlabel('common xlabel')
ax.set_ylabel('common ylabel')
ax1.set_title('ax1 title')
ax2.set_title('ax2 title')
plt.savefig('common_labels.png', dpi=300)
Otra forma es usar fig.text () para establecer las ubicaciones de las etiquetas comunes directamente.
import random
import matplotlib.pyplot as plt
x = range(1, 101)
y1 = [random.randint(1, 100) for _ in xrange(len(x))]
y2 = [random.randint(1, 100) for _ in xrange(len(x))]
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.loglog(x, y1)
ax2.loglog(x, y2)
# Set common labels
fig.text(0.5, 0.04, 'common xlabel', ha='center', va='center')
fig.text(0.06, 0.5, 'common ylabel', ha='center', va='center', rotation='vertical')
ax1.set_title('ax1 title')
ax2.set_title('ax2 title')
plt.savefig('common_labels_text.png', dpi=300)
ax
debe crearse antesax1
yax2
, de lo contrario, la gran trama cubrirá las pequeñas parcelas.Una forma simple de usar
subplots
:fuente
'off'
aFalse
versiones más nuevas de Matplotlib (tengo 2.2.2)for ax in axes: ax.plot(x, y)
no parece hacer ningún bienLa respuesta de Wen-wei Liao es buena si no está tratando de exportar gráficos vectoriales o si ha configurado sus backends matplotlib para ignorar los ejes incoloros; de lo contrario, los ejes ocultos aparecerían en el gráfico exportado.
Mi respuesta
suplabel
aquí es similar a lafig.suptitle
que usa lafig.text
función. Por lo tanto, no se crea ningún artista de ejes y se hace incoloro. Sin embargo, si intenta llamarlo varias veces, se agregará texto uno encima del otro (comofig.suptitle
también lo hace). La respuesta de Wen-wei Liao no lo hace, porquefig.add_subplot(111)
devolverá el mismo objeto Axes si ya está creado.Mi función también se puede invocar después de que se hayan creado las parcelas.
fuente
Aquí hay una solución en la que establece la etiqueta y de una de las parcelas y ajusta su posición para que quede centrada verticalmente. De esta forma, evitas los problemas mencionados por KYC.
fuente
plt.setp()
hará el trabajo:fuente
fuente
Los métodos en las otras respuestas no funcionarán correctamente cuando los yticks sean grandes. La etiqueta se superpondrá con marcas, se recortará a la izquierda o completamente invisible / fuera de la figura.
Modifiqué la respuesta de Hagne para que funcione con más de 1 columna de subtramas, tanto para xlabel como para ylabel, y cambia la trama para mantener la etiqueta visible en la figura.
Funciona para el siguiente ejemplo, mientras que la respuesta de Hagne no dibujará la etiqueta (ya que está fuera del lienzo) y la etiqueta de KYC se superpone con las etiquetas de marca:
Alternativamente, si está bien con el eje incoloro, he modificado la solución de Julian Chen para que Ylabel no se superponga con las etiquetas de marca.
Básicamente, solo tenemos que establecer los límites de color de los incoloros para que coincida con los límites de color más grandes de las subtramas, de modo que las etiquetas de marca incoloras establezcan la ubicación correcta para la etiqueta.
Nuevamente, tenemos que reducir la trama para evitar el recorte. Aquí he codificado la cantidad para reducir, pero puedes jugar para encontrar un número que funcione para ti o calcularlo como en el método anterior.
fuente