Agregar una etiqueta del eje y al eje y secundario en matplotlib

118

Puedo agregar una etiqueta ay al eje y izquierdo usando plt.ylabel, pero ¿cómo puedo agregarlo al eje y secundario?

table = sql.read_frame(query,connection)

table[0].plot(color=colors[0],ylim=(0,100))
table[1].plot(secondary_y=True,color=colors[1])
plt.ylabel('$')
Obispo de Osmond
fuente

Respuestas:

232

La mejor forma es interactuar con el axesobjeto directamente.

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 *y1

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.set_ylabel('Y2 data', color='b')

plt.show()

gráfico de ejemplo

Paul H
fuente
Cómo conseguir el eje y derecho como el izquierdo, quiero decir, de abajo hacia arriba, de 0 a 5, alineado.
Sigur
¿Cómo rotar el texto azul sin superponer las marcas?
Sigur
@Sigur tienes que meterte en pasar el parámetro de alineación horizontal y / o alineación vertical a ax2.set_ylabel
Paul H
@PaulH, descubrí que podemos obtener los límites y de ax1 y configurarlos en ax2, por lo que la posición de las etiquetas estará alineada.
Sigur
@Sigur No sigo cómo los límites de los ejes y las garrapatas interactúan con la rotación de etiquetas, pero si estás contento, buenísimo
Paul H
21

Hay una solución sencilla sin meterse con matplotlib: solo pandas.

Modificando el ejemplo original:

table = sql.read_frame(query,connection)

ax = table[0].plot(color=colors[0],ylim=(0,100))
ax2 = table[1].plot(secondary_y=True,color=colors[1], ax=ax)

ax.set_ylabel('Left axes label')
ax2.set_ylabel('Right axes label')

Básicamente, cuando secondary_y=Truese da la opción (aunque también ax=axse pasa) pandas.plotdevuelve un eje diferente que usamos para establecer las etiquetas.

Sé que esto fue respondido hace mucho tiempo, pero creo que este enfoque lo vale.

Kiril
fuente
Gracias - ¡gran enfoque! Sin embargo, vale la pena señalar que esto solo funciona si traza primero el eje y primario, luego el eje y secundario, exactamente como lo hizo. Si cambia el orden, se comporta mal.
user667489
7

No tengo acceso a Python en este momento, pero en la parte superior de mi cabeza:

fig = plt.figure()

axes1 = fig.add_subplot(111)
# set props for left y-axis here

axes2 = axes1.twinx()   # mirror them
axes2.set_ylabel(...)
Micke
fuente