HOWTO · Matplotlib

Como adicionar uma etiqueta do eixo Y ao eixo Y secundário em Matplotlib

Podemos adicionar uma etiqueta do eixo y ao eixo y secundário em Matplotlib interagindo com o objeto dos eixos e usando diretamente o método pandas.DataFrame.plot.

Nesta página

Para rotular um eixo y secundário no Matplotlib, chame set_ylabel() no axes secundário retornado por Axes.twinx(). O objeto axes retornado compartilha o eixo x do gráfico e fornece um eixo y independente no lado oposto. Use rótulos descritivos, incluindo unidades quando elas ajudarem a distinguir as grandezas.

Adicionar um rótulo ao eixo y secundário com twinx()

Crie o segundo eixo com ax.twinx(), trace a segunda série nele e defina o rótulo diretamente. Este exemplo completo define as duas cores e usa tight_layout() para reservar espaço para os rótulos.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 5, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color="tab:blue")
ax.set_xlabel("Time (s)")
ax.set_ylabel("sin(x)", color="tab:blue")
ax.tick_params(axis="y", labelcolor="tab:blue")

ax2 = ax.twinx()
ax2.plot(x, np.cos(x), color="tab:orange")
ax2.set_ylabel("cos(x)", color="tab:orange")
ax2.tick_params(axis="y", labelcolor="tab:orange")

fig.tight_layout()
plt.show()

Gráfico com sin(x) como rótulo do eixo y azul à esquerda e cos(x) como rótulo do eixo y secundário laranja à direita; as duas curvas são traçadas em função de Time (s).

ax2 é o eixo secundário; portanto, ax2.set_ylabel(...) posiciona o rótulo no eixo y à direita. Se aplicar set_ylabel() a ax, você altera o rótulo principal, à esquerda. Combinar as cores dos rótulos e das marcações com as de cada linha é opcional, mas pode ajudar os leitores a distinguir as duas escalas.

Quando o primeiro exemplo é exibido, o eixo horizontal tem o rótulo Time (s). Uma curva senoidal azul usa o eixo y à esquerda, e uma curva cosseno laranja usa o eixo y à direita. As duas curvas abrangem os mesmos valores de tempo, mas cada escala vertical é lida no respectivo lado da figura. A imagem de destaque deste artigo mostra os eixos Height e Weight; é uma ilustração separada e não representa essas curvas senoidal e cosseno.

Personalizar os rótulos do eixo y para maior clareza

Escolha um texto que identifique a grandeza medida e sua unidade, como Temperature (°C) ou Pressure (kPa). A estilização é opcional: passe argumentos como color, fontsize ou fontweight para set_ylabel() quando isso melhorar a legibilidade. Mantenha os rótulos distintos e não dependa apenas das cores para explicar quais dados pertencem a cada escala.

O exemplo a seguir aplica essas opções de estilo a um gráfico cuja escala da esquerda indica a temperatura em graus Celsius e cuja escala da direita indica a pressão em quilopascais:

import matplotlib.pyplot as plt
import numpy as np

hours = np.arange(0, 24, 2)
temperature = 18 + 4 * np.sin((hours - 9) * np.pi / 12)
pressure = 101.3 + 0.8 * np.cos((hours - 6) * np.pi / 12)

fig, ax = plt.subplots()
ax.plot(hours, temperature, color="tab:red", marker="o")
ax.set_xlabel("Hour of day")
ax.set_ylabel(
    "Temperature (°C)", color="tab:red", fontsize=12, fontweight="bold"
)
ax.tick_params(axis="y", labelcolor="tab:red")

ax2 = ax.twinx()
ax2.plot(hours, pressure, color="tab:green", marker="s")
ax2.set_ylabel(
    "Pressure (kPa)", color="tab:green", fontsize=12, fontweight="bold"
)
ax2.tick_params(axis="y", labelcolor="tab:green")

fig.tight_layout()
plt.show()

Gráfico com um rótulo vermelho em negrito Temperature (°C) no eixo y à esquerda e um rótulo verde em negrito Pressure (kPa) no eixo y secundário à direita.

Trate cada rótulo como uma descrição breve dos valores lidos naquele lado do gráfico, como no exemplo acima. O texto e as unidades explicam o significado dos números; combinar a cor do rótulo com a de uma linha é uma pista visual adicional. Se os rótulos ficarem apertados, tight_layout() pode ajustar o espaçamento da figura, embora um rótulo longo ainda possa exigir uma figura maior ou uma formulação mais curta.

Adicionar um rótulo ao eixo y secundário com DataFrame.plot

Para dados do pandas, passe o eixo do primeiro gráfico por meio de ax ao plotar a segunda série com secondary_y=True. DataFrame.plot retorna um objeto de eixo em cada chamada: a primeira retorna o eixo principal, e a segunda retorna o eixo secundário. Defina cada rótulo no objeto correspondente.

import matplotlib.pyplot as plt
import pandas as pd

frame = pd.DataFrame({
    "age": [10, 20, 30, 40],
    "height": [120, 140, 160, 170],
    "weight": [30, 45, 60, 70],
})

ax = frame.plot(x="age", y="height", color="tab:blue")
ax2 = frame.plot(
    x="age", y="weight", secondary_y=True, ax=ax, color="tab:orange"
)
ax.set_ylabel("Height (cm)")
ax2.set_ylabel("Weight (kg)")
plt.tight_layout()
plt.show()

Gráfico do pandas DataFrame.plot com Height (cm) no eixo y à esquerda e Weight (kg) no eixo y secundário à direita; as duas séries são traçadas em função de age.

Aqui, secondary_y seleciona a escala à direita para o peso, enquanto ax=ax sobrepõe essa série na mesma figura. Se usar nomes de coluna ou unidades diferentes, atualize os argumentos y e os rótulos para que descrevam os dados plotados.

Com os valores deste exemplo, o gráfico exibido tem a idade no eixo horizontal, Height (cm) à esquerda e Weight (kg) à direita. A linha azul da altura sobe ao longo das quatro idades, assim como a linha laranja do peso; cada linha é interpretada usando seu respectivo rótulo e escala do eixo y. Os rótulos devem corresponder às colunas efetivamente plotadas, então ajuste-os ao mudar as colunas selecionadas ou as unidades. Passar o ax existente mantém as duas séries na mesma figura, enquanto secondary_y=True atribui à segunda série a escala do lado direito.