바람장미 읽는 법과 Python으로 바람장미 그리기

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

 바람장미 읽는 법 예시 그림
( 바람장미 읽는 법 예시 그림 – 파이썬 시각화 )

이 글에서는 바람장미 읽는 법을 자세히 설명하며, Python을 사용해 바람장미 그리기를 단계별로 구현하는 방법을 알려드립니다. 이 포스트를 통해 바람장미를 이해하고, 직접 만들어볼 수 있는 기회를 가져보세요!

바람장미란?

바람장미(Wind Rose Diagram)는 특정 지역의 바람 데이터를 방위와 속도로 표현한 그래프입니다. 방위(풍향)는 방위각(0° ~ 360°)으로 나타내며, 풍속은 그래프 중심에서 바깥쪽으로 나아가는 거리를 통해 시각화합니다. 또한, 풍속별로 색상을 다르게 표현해 데이터를 쉽게 이해할 수 있도록 도와줍니다.

바람장미는 다음과 같은 정보를 제공합니다

  1. 주된 바람의 방향: 특정 방향에서 바람이 얼마나 자주 부는지 알 수 있습니다.
  2. 풍속의 강약: 바람의 세기가 약한지, 강한지 파악할 수 있습니다.
  3. 다양한 방위별 바람 분포: 특정 방위(예: 북동, 남서)에서 바람의 특징을 알 수 있습니다.

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

코드 해설

  1. 라이브러리 로드 및 데이터 생성
    • numpypandas를 사용해 풍향(방위)과 풍속 데이터를 생성합니다.
  2. 데이터프레임 생성
    • Direction(풍향)과 Speed(풍속)을 열로 갖는 데이터프레임을 생성합니다.
  3. 극좌표 플롯 생성
    • plt.subplot(projection="polar")를 사용해 바람장미 그리 극좌표 시스템을 설정합니다.
  4. 방향 데이터 변환
    • 풍향 데이터를 radians 함수로 라디안 단위로 변환합니다.
  5. 산점도 생성
    • scatter를 사용해 풍향과 풍속 데이터를 시각화합니다.
    • 풍속에 따라 점의 색상이 변하도록 cmap='YlOrRd'를 설정합니다.
  6. 그래프 설정
    • 북쪽을 기준으로 방위각 0°를 설정(set_theta_zero_location("N")).
    • 각도를 시계 방향으로 증가시키도록 설정(set_theta_direction(-1)).
  7. 컬러바 추가
    • 풍속 범위를 나타내는 컬러바를 추가해 색상이 의미하는 바람 강도를 확인할 수 있습니다.

바람장미 읽는 법

바람장미 읽는 법 요약 이미지
( 바람장미 읽는 법 요약 )
  1. 방위 읽기
    • 바람은 N(북), NE(북동), E(동) 등 8개의 주요 방위에서 불어옵니다.
    • 점이 위치한 각도가 바람이 불어오는 방향을 나타냅니다.
  2. 풍속 읽기
    • 중심에서 멀수록 바람이 강합니다.
    • 동심원은 풍속 단위를 나타내며, 최대값(3.5 m/s)까지 표시됩니다.
  3. 색상 해석
    • 밝은 노란색은 약한 바람을, 붉은색은 강한 바람을 의미합니다.

정리하기

이 글에서는 바람장미 읽는 법과 바람장미 그리기에 대해 다뤘습니다. 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
  1. 라이브러리 임포트
    • pandas: 데이터프레임 생성과 데이터 관리에 사용됩니다.
    • matplotlib.pyplot: 데이터 시각화를 위한 라이브러리입니다.
    • font_managerrc: 한글 폰트를 설정하기 위한 도구입니다.
    • math.radians: 각도를 라디안 값으로 변환하는 데 사용됩니다.
    • numpy: 배열 연산 및 데이터 생성에 사용됩니다.
# 한글 폰트 설정
rc('font', family='HCR Dotum')
  1. 한글 폰트 설정
    • 그래프에서 한글을 제대로 표시하기 위해 폰트를 설정합니다. 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])
  1. 데이터 생성
    • directions: 바람이 불어오는 방향(풍향)을 8개의 방위각(0°, 45°, …, 315°)으로 설정합니다.
    • speeds: 각 방향에서의 바람 속도를 m/s 단위로 나타냅니다.
# 데이터프레임 생성
df = pd.DataFrame({
    'Direction': directions,  # 풍향 데이터
    'Speed': speeds          # 풍속 데이터
})
  1. 데이터프레임 생성
    • Direction: 방위각 데이터를 저장합니다.
    • Speed: 각 방위각에 해당하는 풍속 데이터를 저장합니다.
    • 이 데이터는 바람장미 그래프를 그리는 데 사용됩니다.
def create_wind_rose(data):
    # 극좌표 서브플롯 생성
    fig = plt.figure(figsize=(8, 8))
    sp = plt.subplot(projection="polar")
  1. 함수 정의 및 극좌표 플롯 생성
    • create_wind_rose(data): 입력 데이터프레임을 받아 바람장미를 생성하는 함수입니다.
    • plt.figure(figsize=(8, 8)): 캔버스 크기를 8인치 × 8인치로 설정합니다.
    • plt.subplot(projection="polar"): 극좌표 플롯을 생성합니다. 이 좌표계는 방위각과 반지름을 사용합니다.
    # 방향 데이터를 라디안으로 변환
    direction_rad = np.radians(data['Direction'])
  1. 방향 데이터를 라디안으로 변환
    • np.radians: 각도 데이터를 라디안 값으로 변환합니다.
    • 극좌표계는 방위각을 라디안 값으로 처리하므로 변환이 필요합니다.
    # 산점도 생성
    scatter = sp.scatter(direction_rad, data['Speed'],
                        s=100,                # 마커 크기
                        c=data['Speed'],      # 풍속에 따른 색상 변화
                        cmap='YlOrRd',        # 색상맵 설정
                        alpha=0.6)            # 투명도 설정
  1. 산점도 생성
    • sp.scatter: 극좌표계에서 각 데이터 포인트를 산점도로 표시합니다.
      • s=100: 마커 크기를 설정합니다.
      • c=data['Speed']: 풍속 값을 기반으로 색상을 설정합니다.
      • cmap='YlOrRd': 색상맵을 노랑-주황-빨강 계열로 설정해 강한 바람일수록 진한 색으로 표시합니다.
      • alpha=0.6: 마커의 투명도를 설정합니다.
    # 그래프 기본 설정
    sp.set_theta_zero_location("N")    # 북쪽을 0도로 설정
    sp.set_theta_direction(-1)         # 시계방향으로 각도 증가
  1. 극좌표 설정
    • set_theta_zero_location("N"): 북쪽(N)을 0°로 설정합니다.
    • set_theta_direction(-1): 방위각이 시계 방향으로 증가하도록 설정합니다.
    # 그리드 설정
    sp.grid(True)
  1. 그리드 활성화
    • 방위각과 반지름에 따라 그리드 라인을 활성화해 데이터를 읽기 쉽게 만듭니다.
    # 풍속 범위 설정 (0-3.5 m/s)
    sp.set_ylim(0, 3.5)
  1. 풍속 범위 설정
    • 반지름 범위를 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)
  1. 방위각 레이블 설정
    • angles: 방위각(0°, 45°, …, 315°)을 설정합니다.
    • labels: 각 방위각에 해당하는 방위(N, NE, E 등)를 설정합니다.
    • set_xticks: 방위각의 위치를 라디안 값으로 설정합니다.
    • set_xticklabels: 각 방위각의 이름을 레이블로 표시합니다.
    # 제목과 레이블 설정
    plt.title('Wind Rose Diagram', pad=20)
  1. 그래프 제목 설정
    • plt.title: 그래프 제목을 “Wind Rose Diagram”으로 설정합니다.
    • pad=20: 제목과 그래프 간의 간격을 설정합니다.
    # 컬러바 추가
    cbar = plt.colorbar(scatter)
    cbar.set_label('Wind Speed (m/s)')
  1. 컬러바 추가
    • plt.colorbar(scatter): 풍속에 따른 색상 변화를 나타내는 컬러바를 추가합니다.
    • set_label: 컬러바의 레이블을 “Wind Speed (m/s)”로 설정합니다.
    return fig
  1. 그래프 반환
    • 완성된 그래프 객체(fig)를 반환합니다.
# 바람장미 차트 생성
fig = create_wind_rose(df)

# 그래프 저장 및 출력
plt.savefig('wind_rose.jpg', dpi=300, bbox_inches='tight')
plt.show()
  1. 그래프 생성 및 저장
    • create_wind_rose(df): 앞서 정의한 함수를 호출하여 바람장미를 생성합니다.
    • plt.savefig: 생성된 그래프를 “wind_rose.jpg” 파일로 저장합니다.
    • plt.show: 그래프를 화면에 표시합니다.

유사한 게시물