[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 3: 선과 음영 그리기

2024. 7. 12. 10:11·대기과학/프로그래밍
목차
  1. - 개요
  2. - 강수유무, 60분 강수, 15분 강수,그리기
  3. - matplotlib 그림 그리는 순서 설명

- 개요

저번 포스트에서는 왼쪽에 여러 y축을 그렸습니다.

강수량을 추가로 그려보려고 했지만 제가 처음에 고른 기간에는 강수가 없었습니다.

그래서 강수가 있는 2023년 6월 25일부터 6월 26일까지의 자료를 사용하겠습니다.

2023년 6월 25일부터 6월 26일까지 기상청 그림

이번 포스트에서 주의할 점은 twinx로 그림을 그릴 때 나중에 그린 그림이 가장 위에 올라온다는 것입니다.

선과 점을 그리는 것은 무엇이 먼저 그려지든 그림이 아예 안 보이는 것은 아니기에 큰 문제가 없습니다.

하지만 강수량은 선과 점이 아니라 음영으로 특정 영역을 색칠합니다.

선을 그린 다음에 음영을 칠하면 선이 아예 보이지 않습니다.

그러므로 그리는 순서에 신경을 써야합니다.

 

참고로 matplotlib에서 zorder라는 속성을 쓰면 그림 그리는 순서를 변경할 수 있습니다.

하지만 twinx로 새로운 axes를 선언하면 각각 변수의 그림이 다른 axes에 속하므로 zorder를 쓰는 의미가 없습니다.

저도 파이썬을 쓴 지 6개월 밖에 안되어서 혹시 zorder로 이 문제를 해결할 수 있다면 댓글로 달아주세요.

 

 

- 강수유무, 60분 강수, 15분 강수,그리기

가장 먼저 강수유무(하늘), 60분 강수(파란색), 15분 강수(분홍색) 음영을 그리겠습니다.

위에서 설명했다시피 음영을 가장 마지막에 그리면 다른 그래프를 가려버립니다.

강수 그리기 이외에도 이번에 자료를 바꾸면서 수정한 부분은 주석으로 적었습니다.

import matplotlib.pyplot as plt
y_TA = df['TA']
y_PS = df['PS']
y_HM = df['HM']
y_WS = df['WS10']
y_WS[y_WS == -99.9] = np.NaN # 결측값 처리
y_RN15 = df['RN-15m']
y_RN60 = df['RN-60m']
y_RE = df['RE']*40 # 강수 유무로 0, 1값임, RN15과 RN60의 ymax이 40이므로 40을 곱함
x = range(len(y_TA))

# 색 설정
color_TA = 'red'
color_PS = (255./255., 51./255., 204./255.)
color_HM = (0, 102./255., 153/255.)
color_WS = (50./255., 108./255., 17./255.)
color_WD = (255./255., 153./255., 51./255.)
color_RN60 = (102./255., 153./255., 1.)
color_RN15 = (1., 153./255., 1.)
color_RE = (204./255., 255./255., 255./255.)

fig = plt.figure(figsize=(13,5))

# RE, RN60, RN15
"""
fig.add_subplot()으로 axes를 선언하면 y축은 왼쪽(outward, 0)에 위치
기상청 그래프를 보면 강수에 대한 y축은 가장 왼쪽에 위치하므로 y축 위치를 변경해야 함
강수유무, 60분 강수, 15분 강수 순으로 그려야 함
"""
ax_base = fig.add_subplot()
dx = x[1] - x[0]
ax_base.bar(x, y_RE, color=color_RE, width=dx)
ax_base.bar(x, y_RN60, color=color_RN60, width=dx)
ax_base.bar(x, y_RN15, color=color_RN15, width=dx)
ymin, ymax, dy = 0, 40, 4
ax_base.set_ylim(ymin, ymax)
ax_base.set_yticks(range(ymin, ymax+1, dy))
ax_base.yaxis.set_ticks_position('left')
ax_base.yaxis.set_label_position('left')
ax_base.spines.left.set_position(('outward', 90))

# 온도
color = color_TA
"""
이전 코드에서는 ax_TA와 같은 식으로 변수 이름을 ax_ 뒤에 붙였음
ax = ax_base.twinx() 선언하고 ax.plot() 등으로 그림을 그린 다음
다시 ax = ax_base.twinx()를 선언해도 이전 그림이 지워지는 것이 아님
이런 식으로 변수명을 통일하고 있어야 나중에 함수화하기 쉬움
"""
ax = ax_base.twinx()
ax.plot(x, y_TA, color=color, lw=1)
ymin, ymax = 16, 36
ax.set_ylim(ymin, ymax)
ax.set_yticks(range(ymin, ymax+1, 2))
ax.yaxis.set_ticks_position('left')
ax.yaxis.set_label_position('left')


# 현지기압
color = color_PS
ax = ax_base.twinx()
ax.plot(x, y_PS, color=color, lw=1)
ax.set_ylim(999, 1019)
ax.set_yticks(range(999, 1019+1, 2))

# 습도
color = color_HM
ax = ax_base.twinx()
ax.plot(x, y_HM, color=color, lw=1)
ax.set_ylim(0, 100)
ax.set_yticks(range(0, 100+1, 10))
ax.spines.right.set_position(('outward', 40))

# 풍속
color = color_WS
ax = ax_base.twinx()
ax.plot(x, y_WS, color=color, lw=1)
ax.set_ylim(0, 20)
ax.set_yticks(range(0, 20+1, 2))
ax.yaxis.set_ticks_position('left')
ax.yaxis.set_label_position('left')
ax.spines.left.set_position(('outward', 30))

# 풍향
y_WD = df['WD10']
df.loc[df['WD10'] < 90, 'WD10'] += 360
color = color_WD
ax = ax_base.twinx()
ax.scatter(x, y_WD, color=color, s=4)
ax.set_ylim(90, 90+360)
ax.set_yticks(range(90, 90+360+1, 90))
ax.set_yticklabels(['E', 'S', 'W', 'N', 'E'])
ax.yaxis.set_ticks_position('left')
ax.yaxis.set_label_position('left')
ax.spines.left.set_position(('outward', 60))

결과

 

- matplotlib 그림 그리는 순서 설명

이제 그려야 하는 변수는 다 그렸으므로 matplotlib에서 그림 그리는 순서를 간단히 설명하고자 합니다.

늦은 감이 있지만 솔직히 단순한 그림만 그리려면 matplotlib이 어떻게 동작하는지 알 필요가 없습니다.

다만 여러 개의 y축을 써서 그림을 그리려면 아는 게 좋지 않을까라는 생각이 들었습니다.

 

위에서 작성한 코드의 일부를 활용해 설명하겠습니다.

 

fig = plt.figure(figsize=(13,5)) 
""" 
plt.figure는 우리가 그림을 그릴 도화지(정확히는 canvas)를 설정합니다.
"""

ax_base = fig.add_subplot()
""" 
fig라는 도화지에서 그림 그릴 영역을 정합니다.
저는 도화지에 그림 1개만 그릴거라 따로 input을 지정하지 않았습니다.
이러면 자동으로 1행 1열은 모든 도화지 영역이 되고, 이 위치에 그림을 그림

하지만 2x2로 그림 4장을 그리려면 ax = fig.add_subplot(221)와 같은 식으로 설정해야합니다.
221의 의미는 도화지 내에서 2행, 2열의 그림 배치를 할건데 1번 위치(1행, 1열)에 그리겠다는 것입니다.
"""

# ax_base에 강수 유무, 60분 강수량, 15분 강수량 순서대로 그림
ax_base.bar(x, y_RE, color=color_RE, width=dx)
ax_base.bar(x, y_RN60, color=color_RN60, width=dx)
ax_base.bar(x, y_RN15, color=color_RN15, width=dx)


ax = ax_base.twinx()
"""
ax_base라는 그림의 x축을 공유해서 그리겠다는 뜻입니다.
"""
ax.plot(x, y_TA, color=color, lw=1) # ax_base와 x축 공유하는 그림을 그림

ax = ax_base.twinx()
"""
다음 그림을 그릴 때는 ax = ax_base.twinx()로 x축을 공유하는 그림을 그리겠다고 선언
위에서도 설명했지만 이렇게 선언한다고 해서 먼저 그린 그림이 지워지지 않음
전 scatter plot을 마지막에 그리고 싶어서
온도 > 현지기압 > 습도 > 풍속 > 풍향 순으로 그림을 그렸습니다.
"""

 

다음에는 각 변수에 맞는 색을 y축, y축 tick, label에 적용해보겠습니다.

'대기과학 > 프로그래밍' 카테고리의 다른 글

[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 5: 반복하는 부분을 for문으로 만들기  (0) 2024.07.19
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 4: y축, 축의 라벨 색 바꾸기  (0) 2024.07.18
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 2: 왼쪽에 y축 여러 개 그리기  (0) 2024.07.11
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 1: 오른쪽에 y축 여러 개 그리기  (0) 2024.07.10
[ERA5 재분석 자료] 2. 시간(hourly) 자료를 일(daily) 자료로 변환하고 저장하기  (1) 2024.07.01
  1. - 개요
  2. - 강수유무, 60분 강수, 15분 강수,그리기
  3. - matplotlib 그림 그리는 순서 설명
'대기과학/프로그래밍' 카테고리의 다른 글
  • [Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 5: 반복하는 부분을 for문으로 만들기
  • [Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 4: y축, 축의 라벨 색 바꾸기
  • [Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 2: 왼쪽에 y축 여러 개 그리기
  • [Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 1: 오른쪽에 y축 여러 개 그리기
레까
레까
  • 레까
    데이터 조아
    레까
  • 전체
    오늘
    어제
    • 전체 (87) N
      • 대기과학 (45)
        • 프로그래밍 (42)
        • 개념 (2)
        • 칼럼 (1)
      • 여러가지 데이터 (5)
        • 프로그래밍 & 분석 (5)
      • 프로그래밍 (16) N
        • 파이썬 (8)
        • 시각화 (7) N
        • 유용 (1)
      • 프로젝트 (17)
        • 기계학습 기반 서울 기온 예측 (9)
        • 사과게임 매크로 만들기 (4)
        • 버스 한 번으로 특정 지역에 갈 수 있는 지역 찾.. (4)
      • 데이터리안 SQL 공부 (3)
      • 주제별 링크 모음 (1)
      • 백업 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
레까
[Matplotlib] 기상청 ASOS/AWS 그래프 따라 그리기 3: 선과 음영 그리기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.