HOWTO · Matplotlib
Matplotlib에서 2 차 Y 축에 Y 축 레이블을 추가하는 방법
좌표축 개체와 상호 작용하고 pandas.DataFrame.plot 메서드를 사용하여 Matplotlib의 보조 y 축에 y 축 레이블을 추가 할 수 있습니다.
이 페이지의 내용
Matplotlib에서 보조 y축에 레이블을 지정하려면 Axes.twinx()가 반환하는 보조 axes 객체에 set_ylabel()을 호출합니다. 반환된 axes 객체는 그래프의 x축을 공유하면서 반대편에 독립적인 y축을 제공합니다. 측정값을 구분하는 데 도움이 된다면 단위를 포함해 의미가 분명한 레이블을 사용하세요.
twinx()로 보조 y축에 레이블 지정하기
ax.twinx()로 두 번째 axes를 만들고, 두 번째 데이터 계열을 그 axes에 그린 다음 해당 객체에 직접 레이블을 지정합니다. 다음 완전한 예시는 두 선의 색을 모두 정의하고 tight_layout()으로 레이블을 위한 공간을 확보합니다.
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()
보조 axes는 ax2이므로 ax2.set_ylabel(...)을 호출하면 오른쪽 y축에 레이블이 표시됩니다. 대신 ax에 set_ylabel()을 적용하면 기본 왼쪽 y축의 레이블이 바뀝니다. 레이블과 눈금의 색을 각 선의 색에 맞추는 것은 선택 사항이지만, 두 축의 눈금을 구분하는 데 도움이 될 수 있습니다.
첫 번째 예시를 표시하면 가로축에는 Time (s)가 표시됩니다. 파란색 사인 곡선은 왼쪽 y축을, 주황색 코사인 곡선은 오른쪽 y축을 사용합니다. 두 곡선은 같은 시간값에 걸쳐 그려지며, 각 세로축의 눈금은 그래프의 해당 쪽에서 읽습니다. 코드 블록은 바이트 동일성을 위해 변경할 수 없으므로 축 레이블은 영어로 표시됩니다. 이 글의 대표 이미지는 Height와 Weight 축을 보여 주는 별도의 그림이며, 사인 및 코사인 곡선을 나타내지는 않습니다.
알아보기 쉬운 y축 레이블 만들기
Temperature (°C) 또는 Pressure (kPa)처럼 측정 대상과 단위를 나타내는 문구를 선택하세요. 스타일 지정은 필수가 아닙니다. 가독성을 높이는 데 도움이 된다면 color, fontsize, fontweight 같은 인수를 set_ylabel()에 전달할 수 있습니다. 두 레이블을 서로 구별하고, 어떤 데이터가 어느 축에 해당하는지 색상만으로 설명하지 마세요.
다음 예시는 왼쪽 축이 섭씨온도를, 오른쪽 축이 킬로파스칼 단위의 압력을 나타내는 그래프에 이러한 스타일 옵션을 적용합니다.
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()
각 레이블은 해당 축에서 읽는 값에 대한 짧은 설명이라고 생각하면 됩니다. 위 예시처럼 텍스트와 단위가 숫자의 의미를 알려 주고, 레이블 색을 선 색에 맞추면 추가적인 시각 단서가 됩니다. 레이블이 서로 겹쳐 보이면 tight_layout()으로 그림의 여백을 조정할 수 있지만, 레이블이 길다면 그림을 더 크게 만들거나 문구를 짧게 다듬어야 할 수도 있습니다.
DataFrame.plot으로 보조 y축에 레이블 지정하기
pandas 데이터를 사용할 때 두 번째 데이터 계열을 secondary_y=True로 그리면서 첫 번째 플롯의 axes를 ax에 전달하세요. DataFrame.plot은 호출할 때마다 axes 객체를 반환합니다. 첫 번째 호출은 기본 axes를 반환하고, 두 번째 호출은 보조 axes를 반환합니다. 각 객체에 해당하는 레이블을 지정하세요.
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()
여기서 secondary_y는 weight에 오른쪽 축을 사용하도록 지정하고, ax=ax는 두 번째 데이터 계열을 같은 그림에 겹쳐 그립니다. 다른 열 이름이나 단위를 사용한다면 y 인수와 레이블을 모두 수정해 실제로 그리는 데이터를 설명하도록 하세요.
이 예시의 값으로 그래프를 표시하면 가로축에는 나이가, 왼쪽에는 Height (cm), 오른쪽에는 Weight (kg)가 표시됩니다. 파란색 height 선과 주황색 weight 선은 모두 나이가 증가함에 따라 상승합니다. 각 선은 해당 y축 레이블과 눈금을 기준으로 읽습니다. 레이블은 실제로 그린 열에 맞아야 하므로 선택한 열이나 단위를 바꾸면 레이블도 수정하세요. 코드 블록은 바이트 동일성을 위해 변경할 수 없으므로 그래프의 축 레이블은 영어로 표시됩니다. 기존 ax를 전달하면 두 계열이 한 그림에 표시되고, secondary_y=True를 사용하면 두 번째 계열에 오른쪽 축이 지정됩니다.