Adicionando um rótulo de eixo y ao eixo y secundário em matplotlib

118

Posso adicionar um rótulo y ao eixo y esquerdo usando plt.ylabel, mas como posso adicioná-lo ao eixo y secundário?

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('$')
Osmond Bishop
fonte

Respostas:

232

A melhor maneira é interagir com o axesobjeto diretamente

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 exemplo

Paul H
fonte
Como obter o eixo y direito como o esquerdo, quero dizer, de baixo para cima, de 0 a 5, alinhado.
Sigur
Como girar o texto azul sem sobrepor as marcas?
Sigur,
@Sigur, você tem que mexer em passar o parâmetro de alinhamento horizontal e / ou alinhamento vertical para ax2.set_ylabel
Paul H
@PaulH, descobri que podemos obter os limites y de ax1 e configurá-los para ax2, de forma que a posição dos rótulos seja alinhada.
Sigur
@Sigur Não sigo como os limites dos eixos e as marcações interagem com a rotação do rótulo, mas se você estiver feliz, boa sorte
Paul H
21

Existe uma solução direta sem mexer com matplotlib: apenas pandas.

Ajustando o exemplo 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')

Basicamente, quando a secondary_y=Trueopção é fornecida (embora também ax=axseja passada), pandas.plotretorna um eixo diferente que usamos para definir os rótulos.

Sei que isso foi respondido há muito tempo, mas acho que vale a pena essa abordagem.

Kiril
fonte
Obrigado - ótima abordagem! No entanto, é importante notar que isso só funciona se você plotar primeiro no eixo y primário e, em seguida, no eixo y secundário, exatamente como fez. Se você mudar a ordem, ela se comportará mal.
user667489
7

Não tenho acesso ao Python agora, mas da minha cabeça:

fig = plt.figure()

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

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