- 개요
xy 그래프를 그리다보면 y축을 여러 개 그려야 할 일이 있습니다.
예를 들어 기상청에서 제공하는 AWS(자동기상관측) 그래프에는 축이 무려 6개나 나옵니다.
왼쪽의 y축에는 R(강수량), W(풍향), S(풍속), T(온도)가 있고, 오른쪽의 y축에는 P(기압), H(습도)가 있습니다.
이번 포스트에서는 왼쪽에 y축 1개, 오른쪽에 y축 여러 개 그리는 방법에 대해 알아보겠습니다.
최종적으론 완벽하진 않더라도 아래의 AWS 그래프를 따라그리는 것을 목표로 포스트를 연재하겠습니다.

- 오른쪽에 y축을 1개 추가하기
오른쪽에 y축을 1개 추가하는 방법은 간단합니다.
twinx() 메서드를 사용하고 그냥 plot으로 그래프를 그리면 끝입니다.
저는 API로 다운로드 받은 5분 간격 AWS 자료를 사용했습니다.
예시 AWS 그림과 같은 시간대인 2024년 6월 1일부터 2일까지 108번 관측소 자료를 사용했습니다.
import matplotlib.pyplot as plt
import pandas as pd
# pandas로 AWS 자료의 TA, PS를 미리 읽어둠
y_TA = df['TA']
y_PS = df['PS']
x = range(len(y_TA))
# 변수에 필요한 색 지정
color_TA = 'red'
color_PS = (255./255., 51./255., 204./255.)
fig = plt.figure(figsize=(13,5))
color = color_TA
ax_TA = fig.add_subplot()
ax_TA.plot(x, y_TA, color=color, lw=1)
ax_TA.set_ylim(10, 30)
ax_TA.set_yticks(range(10, 30+1, 2))
color = color_PS
"""
twinx 메서드를 이용해 ax_PS는 ax_TA와 x축을 공유하게 만듭니다.
이 때 자동으로 ax_PS에서 그린 그래프의 y축은 오른쪽에 위치합니다.
"""
ax_PS = ax_TA.twinx()
ax_PS.plot(x, y_PS, color=color, lw=1)
ax_PS.set_ylim(999, 1019)
ax_PS.set_yticks(range(999, 1019+1, 2))
위의 코드를 실행하면 아래의 그림이 나오는데요.
제가 그린 그래프의 모양이 예시의 그래프와 완전히 같습니다.

- 오른쪽에 y축을 2개 추가하기
앞에서 twinx를 이용해 오른쪽에 y축을 추가했습니다.
그럼 twinx를 한 번 더 이용하면 오른쪽에 y축을 2개 추가할 수 있지 않을까요?
앞선 코드에 twinx 메서드를 이용해 습도 그래프를 그려보았습니다.

그림은 제대로 그려졌는데 오른쪽 y축의 y라벨과 tick이 겹칩니다.
twinx를 그냥 사용하면 2개의 y축이 겹치기 때문에 y축 위치를 지정해줘야 합니다.
y축 위치 조정을 위해 spines 메서드를 사용합니다.
import matplotlib.pyplot as plt
y_TA = df['TA']
y_PS = df['PS']
y_HM = df['HM']
x = range(len(y_TA))
color_TA = 'red'
color_PS = (255./255., 51./255., 204./255.)
color_HM = (0, 102./255., 153/255.)
fig = plt.figure(figsize=(13,5))
color = color_TA
ax_TA = fig.add_subplot()
ax_TA.plot(x, y_TA, color=color, lw=1)
ax_TA.set_ylim(10, 30)
ax_TA.set_yticks(range(10, 30+1, 2))
color = color_PS
ax_PS = ax_TA.twinx()
ax_PS.plot(x, y_PS, color=color, lw=1)
ax_PS.set_ylim(999, 1019)
ax_PS.set_yticks(range(999, 1019+1, 2))
# 습도 그리는 부분을 추가함
color = color_HM
ax_HM = ax_TA.twinx()
ax_HM.plot(x, y_HM, color=color, lw=1)
ax_HM.set_ylim(0, 100)
ax_HM.set_yticks(range(0,100+1, 10))
"""
오른쪽(right)을 기준으로 'outward' 방향으로 40만큼 이동
"""
ax_HM.spines.right.set_position(('outward', 40))
습도를 나타내는 오른쪽 y축이 좀 더 오른쪽으로 이동했습니다.

이처럼 twinx를 이용하면 기본적으로 오른쪽 y축을 추가할 수 있습니다.
다음 포스트에서는 왼쪽 y축을 추가하는 방법에 대해 알아보겠습니다.
'대기과학 > 프로그래밍' 카테고리의 다른 글
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 3: 선과 음영 그리기 (1) | 2024.07.12 |
---|---|
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 2: 왼쪽에 y축 여러 개 그리기 (0) | 2024.07.11 |
[ERA5 재분석 자료] 2. 시간(hourly) 자료를 일(daily) 자료로 변환하고 저장하기 (1) | 2024.07.01 |
[ERA5 재분석 자료] 1. API를 활용한 다운로드 (2024년 10월 수정) (0) | 2024.06.21 |
[MetPy] Vertical cross section, 연직단면 그리기 (0) | 2024.06.17 |