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()
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()
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()
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.