바람장미 읽는 법과 Python으로 바람장미 그리기
혹시 바람장미(Wind Rose Diagram)를 본 적 있으신가요? 바람장미는 특정 지역에서 바람의 방향과 속도를 한눈에 파악할 수 있도록 시각화한 그래프입니다. 과학, 환경 연구, 항공, 해양 등 다양한 분야에서 널리 사용됩니다.

이 글에서는 바람장미 읽는 법을 자세히 설명하며, Python을 사용해 바람장미 그리기를 단계별로 구현하는 방법을 알려드립니다. 이 포스트를 통해 바람장미를 이해하고, 직접 만들어볼 수 있는 기회를 가져보세요!
바람장미란?
바람장미(Wind Rose Diagram)는 특정 지역의 바람 데이터를 방위와 속도로 표현한 그래프입니다. 방위(풍향)는 방위각(0° ~ 360°)으로 나타내며, 풍속은 그래프 중심에서 바깥쪽으로 나아가는 거리를 통해 시각화합니다. 또한, 풍속별로 색상을 다르게 표현해 데이터를 쉽게 이해할 수 있도록 도와줍니다.
바람장미는 다음과 같은 정보를 제공합니다
- 주된 바람의 방향: 특정 방향에서 바람이 얼마나 자주 부는지 알 수 있습니다.
- 풍속의 강약: 바람의 세기가 약한지, 강한지 파악할 수 있습니다.
- 다양한 방위별 바람 분포: 특정 방위(예: 북동, 남서)에서 바람의 특징을 알 수 있습니다.
Python으로 바람장미 그리기
아래는 Python을 사용해 바람장미 그리 코드입니다. 이 코드는 풍향과 풍속 데이터를 기반으로 방위별 바람 분포를 시각화합니다.
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
from math import radians
import numpy as np
# 한글 폰트 설정
rc('font', family='HCR Dotum')
# 샘플 데이터 생성 (실제 데이터로 교체 가능)
directions = np.array([0, 45, 90, 135, 180, 225, 270, 315])
speeds = np.array([2.5, 1.5, 1.0, 2.0, 3.0, 2.0, 1.0, 1.5])
# 데이터프레임 생성
df = pd.DataFrame({
'Direction': directions, # 풍향 데이터
'Speed': speeds # 풍속 데이터
})
def create_wind_rose(data):
# 극좌표 서브플롯 생성
fig = plt.figure(figsize=(8, 8))
sp = plt.subplot(projection="polar")
# 방향 데이터를 라디안으로 변환
direction_rad = np.radians(data['Direction'])
# 산점도 생성
scatter = sp.scatter(direction_rad, data['Speed'],
s=100, # 마커 크기
c=data['Speed'], # 풍속에 따른 색상 변화
cmap='YlOrRd', # 색상맵 설정
alpha=0.6) # 투명도 설정
# 그래프 기본 설정
sp.set_theta_zero_location("N") # 북쪽을 0도로 설정
sp.set_theta_direction(-1) # 시계방향으로 각도 증가
# 그리드 설정
sp.grid(True)
# 풍속 범위 설정 (0-3.5 m/s)
sp.set_ylim(0, 3.5)
# 방위각 레이블 설정
angles = np.arange(0, 360, 45)
labels = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW']
sp.set_xticks(np.radians(angles))
sp.set_xticklabels(labels)
# 제목과 레이블 설정
plt.title('Wind Rose Diagram', pad=20)
# 컬러바 추가
cbar = plt.colorbar(scatter)
cbar.set_label('Wind Speed (m/s)')
return fig
# 바람장미 차트 생성
fig = create_wind_rose(df)
# 그래프 저장 및 출력
plt.savefig('wind_rose.jpg', dpi=300, bbox_inches='tight')
plt.show()
코드 해설
- 라이브러리 로드 및 데이터 생성
numpy와pandas를 사용해 풍향(방위)과 풍속 데이터를 생성합니다.
- 데이터프레임 생성
Direction(풍향)과Speed(풍속)을 열로 갖는 데이터프레임을 생성합니다.
- 극좌표 플롯 생성
plt.subplot(projection="polar")를 사용해 바람장미 그리 극좌표 시스템을 설정합니다.
- 방향 데이터 변환
- 풍향 데이터를
radians함수로 라디안 단위로 변환합니다.
- 풍향 데이터를
- 산점도 생성
scatter를 사용해 풍향과 풍속 데이터를 시각화합니다.- 풍속에 따라 점의 색상이 변하도록
cmap='YlOrRd'를 설정합니다.
- 그래프 설정
- 북쪽을 기준으로 방위각 0°를 설정(
set_theta_zero_location("N")). - 각도를 시계 방향으로 증가시키도록 설정(
set_theta_direction(-1)).
- 북쪽을 기준으로 방위각 0°를 설정(
- 컬러바 추가
- 풍속 범위를 나타내는 컬러바를 추가해 색상이 의미하는 바람 강도를 확인할 수 있습니다.
바람장미 읽는 법

- 방위 읽기
- 바람은
N(북),NE(북동),E(동)등 8개의 주요 방위에서 불어옵니다. - 점이 위치한 각도가 바람이 불어오는 방향을 나타냅니다.
- 바람은
- 풍속 읽기
- 중심에서 멀수록 바람이 강합니다.
- 동심원은 풍속 단위를 나타내며, 최대값(3.5 m/s)까지 표시됩니다.
- 색상 해석
- 밝은 노란색은 약한 바람을, 붉은색은 강한 바람을 의미합니다.
정리하기
이 글에서는 바람장미 읽는 법과 바람장미 그리기에 대해 다뤘습니다. Python을 활용해 데이터를 시각화하는 과정과, 결과물을 해석하는 방법까지 배울 수 있었습니다. 바람장미를 통해 특정 지역의 바람 데이터를 더 잘 이해하고, 필요한 의사 결정을 돕는 도구로 활용해 보세요!
참고로, 바람장미가 신선한 분은 아마 스템플롯도 그러지 않을까 합니다. 수치형 데이터 파이썬 시각화하기: 스템 플롯(Stem Plot) 활용법 포스트 리뷰를 통해서 새로운 그래프 시각화 방법을 확인해보세요!
# 코드 상세 해설
import pandas as pd import matplotlib.pyplot as plt from matplotlib import font_manager, rc from math import radians import numpy as np
- 라이브러리 임포트
pandas: 데이터프레임 생성과 데이터 관리에 사용됩니다.matplotlib.pyplot: 데이터 시각화를 위한 라이브러리입니다.font_manager와rc: 한글 폰트를 설정하기 위한 도구입니다.math.radians: 각도를 라디안 값으로 변환하는 데 사용됩니다.numpy: 배열 연산 및 데이터 생성에 사용됩니다.# 한글 폰트 설정 rc('font', family='HCR Dotum')
- 한글 폰트 설정
- 그래프에서 한글을 제대로 표시하기 위해 폰트를 설정합니다.
HCR Dotum은 한글 지원 폰트입니다.- 시스템에 설치된 다른 한글 폰트를 사용할 수도 있습니다.
# 샘플 데이터 생성 (실제 데이터로 교체 가능) directions = np.array([0, 45, 90, 135, 180, 225, 270, 315]) speeds = np.array([2.5, 1.5, 1.0, 2.0, 3.0, 2.0, 1.0, 1.5])
- 데이터 생성
directions: 바람이 불어오는 방향(풍향)을 8개의 방위각(0°, 45°, …, 315°)으로 설정합니다.speeds: 각 방향에서의 바람 속도를 m/s 단위로 나타냅니다.# 데이터프레임 생성 df = pd.DataFrame({ 'Direction': directions, # 풍향 데이터 'Speed': speeds # 풍속 데이터 })
- 데이터프레임 생성
Direction: 방위각 데이터를 저장합니다.Speed: 각 방위각에 해당하는 풍속 데이터를 저장합니다.- 이 데이터는 바람장미 그래프를 그리는 데 사용됩니다.
def create_wind_rose(data): # 극좌표 서브플롯 생성 fig = plt.figure(figsize=(8, 8)) sp = plt.subplot(projection="polar")
- 함수 정의 및 극좌표 플롯 생성
create_wind_rose(data): 입력 데이터프레임을 받아 바람장미를 생성하는 함수입니다.plt.figure(figsize=(8, 8)): 캔버스 크기를 8인치 × 8인치로 설정합니다.plt.subplot(projection="polar"): 극좌표 플롯을 생성합니다. 이 좌표계는 방위각과 반지름을 사용합니다.# 방향 데이터를 라디안으로 변환 direction_rad = np.radians(data['Direction'])
- 방향 데이터를 라디안으로 변환
np.radians: 각도 데이터를 라디안 값으로 변환합니다.- 극좌표계는 방위각을 라디안 값으로 처리하므로 변환이 필요합니다.
# 산점도 생성 scatter = sp.scatter(direction_rad, data['Speed'], s=100, # 마커 크기 c=data['Speed'], # 풍속에 따른 색상 변화 cmap='YlOrRd', # 색상맵 설정 alpha=0.6) # 투명도 설정
- 산점도 생성
sp.scatter: 극좌표계에서 각 데이터 포인트를 산점도로 표시합니다.
s=100: 마커 크기를 설정합니다.c=data['Speed']: 풍속 값을 기반으로 색상을 설정합니다.cmap='YlOrRd': 색상맵을 노랑-주황-빨강 계열로 설정해 강한 바람일수록 진한 색으로 표시합니다.alpha=0.6: 마커의 투명도를 설정합니다.# 그래프 기본 설정 sp.set_theta_zero_location("N") # 북쪽을 0도로 설정 sp.set_theta_direction(-1) # 시계방향으로 각도 증가
- 극좌표 설정
set_theta_zero_location("N"): 북쪽(N)을 0°로 설정합니다.set_theta_direction(-1): 방위각이 시계 방향으로 증가하도록 설정합니다.# 그리드 설정 sp.grid(True)
- 그리드 활성화
- 방위각과 반지름에 따라 그리드 라인을 활성화해 데이터를 읽기 쉽게 만듭니다.
# 풍속 범위 설정 (0-3.5 m/s) sp.set_ylim(0, 3.5)
- 풍속 범위 설정
- 반지름 범위를 0 ~ 3.5 m/s로 제한합니다.
- 이 범위 내에서 각 방향의 풍속이 표시됩니다.
# 방위각 레이블 설정 angles = np.arange(0, 360, 45) labels = ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'] sp.set_xticks(np.radians(angles)) sp.set_xticklabels(labels)
- 방위각 레이블 설정
angles: 방위각(0°, 45°, …, 315°)을 설정합니다.labels: 각 방위각에 해당하는 방위(N, NE, E 등)를 설정합니다.set_xticks: 방위각의 위치를 라디안 값으로 설정합니다.set_xticklabels: 각 방위각의 이름을 레이블로 표시합니다.# 제목과 레이블 설정 plt.title('Wind Rose Diagram', pad=20)
- 그래프 제목 설정
plt.title: 그래프 제목을 “Wind Rose Diagram”으로 설정합니다.pad=20: 제목과 그래프 간의 간격을 설정합니다.# 컬러바 추가 cbar = plt.colorbar(scatter) cbar.set_label('Wind Speed (m/s)')
- 컬러바 추가
plt.colorbar(scatter): 풍속에 따른 색상 변화를 나타내는 컬러바를 추가합니다.set_label: 컬러바의 레이블을 “Wind Speed (m/s)”로 설정합니다.return fig
- 그래프 반환
- 완성된 그래프 객체(
fig)를 반환합니다.# 바람장미 차트 생성 fig = create_wind_rose(df) # 그래프 저장 및 출력 plt.savefig('wind_rose.jpg', dpi=300, bbox_inches='tight') plt.show()
- 그래프 생성 및 저장
create_wind_rose(df): 앞서 정의한 함수를 호출하여 바람장미를 생성합니다.plt.savefig: 생성된 그래프를 “wind_rose.jpg” 파일로 저장합니다.plt.show: 그래프를 화면에 표시합니다.





