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

댓글남기기