[Python] Plotly Graph Objects로 데이터 시각화하기 (Part 2)
Plotly 심화: 축 디테일과 Subplots 정복하기
시각화의 퀄리티는 결국 ‘디테일’에서 결정된다고 생각한다. 오늘은 Plotly의 Graph Objects를 활용해서 축과 그리드를 내 마음대로 커스터마이징하고, make_subplots로 복잡한 레이아웃을 구성하는 방법을 정리해봤다.
실습 데이터로는 Kaggle Global Temperature Dataset을 사용했고, 서울, 도쿄, 베이징의 온도 변화를 시각화해봤다.
1. 데이터 준비
1849년부터 2013년까지의 전 세계 주요 도시 온도 데이터다.
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.read_csv('GlobalLandTemperatures_GlobalLandTemperaturesByMajorCity.csv')
# 도시별 데이터 필터링 및 날짜 변환
def get_city_data(city_name):
temp = df[df['City'] == city_name].copy()
temp['dt'] = pd.to_datetime(temp['dt'])
return temp
seoul_df = get_city_data('Seoul')
tokyo_df = get_city_data('Tokyo')
beijing_df = get_city_data('Peking')
2. 축과 그리드 커스터마이징 (Axis & Grid)
기본 그래프는 깔끔하지만 어딘가 심심하다. 축 스타일을 명확하게 잡아서 ‘전문가스러운’ 느낌을 내보자.
2.1 축선(Axis Line)과 테두리(Mirror)
fig = go.Figure()
fig.add_trace(go.Scatter(x=seoul_df['dt'], y=seoul_df['AverageTemperature'], mode='lines', name='Seoul'))
# X축, Y축 스타일 동시 설정
fig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)
fig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)
fig.show()
mirror=True: 반대편(오른쪽/위쪽)에도 축선을 그려서 그래프를 액자처럼 감싸준다. 훨씬 안정감 있어 보인다.
2.2 그리드(Grid) 디테일 설정
데이터 값을 더 정확하게 읽기 위해 보조 그리드(Minor Grid)까지 추가해봤다.
# 그리드 스타일 예시
fig.update_xaxes(
showgrid=True, gridwidth=1, gridcolor='lightgray', griddash='dot', # 주요 그리드
minor_showgrid=True, minor_gridwidth=0.5, minor_gridcolor='lightblue', minor_griddash='dash' # 보조 그리드
)
griddash='dot': 실선 대신 점선으로 그리드를 그려서 데이터에 집중할 수 있게 했다.
3. Subplots: 그래프 나누고 합치기
여러 그래프를 한 화면에 배치할 때는 make_subplots가 필수다.
3.1 기본 Subplots (1행 2열)
서울과 도쿄의 온도를 나란히 비교해보자.
# 1행 2열 구조 생성
fig = make_subplots(
rows=1, cols=2,
subplot_titles=('Tokyo Temperature', 'Seoul Temperature'),
shared_yaxes=True # Y축 공유 (비교 용이)
)
# add_trace시 row, col 지정 필수
fig.add_trace(go.Scatter(x=tokyo_df['dt'], y=tokyo_df['AverageTemperature'], name='Tokyo'), row=1, col=1)
fig.add_trace(go.Scatter(x=seoul_df['dt'], y=seoul_df['AverageTemperature'], name='Seoul'), row=1, col=2)
3.2 복잡한 레이아웃 (Specs & Colspan)
단순 격자가 아니라, 한 그래프가 두 칸을 차지하게 하려면 specs 옵션을 써야 한다.
# 2행 2열 구조, 첫 번째 행은 통째로 쓰기(colspan=2)
fig = make_subplots(
rows=2, cols=2,
specs=[[{"colspan": 2}, None], # 1행: 2칸 병합
[{}, {}]], # 2행: 2개 분리
subplot_titles=('Seoul (Total)', 'Tokyo', 'Beijing')
)
# Trace 추가 생략 (위치만 맞춰주면 됨)
엑셀 셀 병합하듯이 colspan을 주면 되는데, 뒤에 None을 넣어줘야 하는 게 포인트다.
4. 정리
오늘 실습한 핵심 메서드들이다.
| 기능 | 메서드/옵션 | 용도 |
|---|---|---|
| 축선 설정 | showline, linewidth |
축 선 표시 및 두께 설정 |
| 테두리 | mirror=True |
그래프 반대편에도 축 표시 |
| 그리드 | showgrid, minor_showgrid |
주요/보조 격자 표시 |
| 분할 차트 | make_subplots() |
여러 그래프 레이아웃 생성 |
| 축 공유 | shared_yaxes=True |
서브플롯 간 Y축 스케일 통일 |
| 셀 병합 | specs=[{"colspan": 2}] |
서브플롯 공간 병합 |
이 정도만 자유자재로 다뤄도 웬만한 시각화 요구사항은 다 맞출 수 있을 것 같다. 다음엔 상호작용(Interactive) 기능을 좀 더 파봐야겠다.
Reference
- Dataset: Kaggle Global Temperature Records
댓글남기기