[Python] Plotly Graph Objects로 데이터 시각화하기 (Part 1)
Plotly Graph Objects 실습: 내 맘대로 그래프 뜯어고치기
오늘은 Plotly의 graph_objects를 활용한 데이터 시각화 실습을 진행했다. 보통은 plotly.express가 편해서 많이 쓰지만, 디테일한 커스터마이징이 필요한 순간에는 결국 저수준 API인 graph_objects를 건드려야 한다.
이번 실습에서는 Kaggle Pokemon 데이터셋을 사용해서, 피규어 생성부터 축 조작까지 하나씩 뜯어보며 정리했다.
1. 데이터 로드 및 준비
먼저 필요한 라이브러리와 데이터를 불러온다. 포켓몬 데이터는 HP, 공격(Attack), 방어(Defense) 등 수치형 데이터가 많아 시각화 연습하기 딱 좋다.
import pandas as pd
import plotly.graph_objects as go
df = pd.read_csv('Pokemon.csv')
2. 기본 그래프 생성 (Figure & Trace)
graph_objects의 핵심은 빈 도화지(Figure)를 만들고, 그 위에 그림(Trace)을 하나씩 얹는 방식이다.
fig = go.Figure()
# 첫 번째 Trace: 공격력 vs 방어력
fig.add_trace(go.Scatter(
x=df['Attack'],
y=df['Defense'],
mode='markers',
name='Attack vs Defense'
))
# 두 번째 Trace: 체력 vs 스피드
fig.add_trace(go.Scatter(
x=df['HP'],
y=df['Speed'],
mode='markers',
name='HP vs Speed'
))
fig.show()
이렇게 하면 하나의 그래프 안에 두 종류의 상관관계가 동시에 표현된다. 범례(Legend)를 클릭해서 보고 싶은 데이터만 껐다 킬 수 있는 게 Plotly의 장점이다.
3. Trace 업데이트 (Update Traces)
이미 그려진 Trace들의 스타일을 일괄적으로, 혹은 선택적으로 바꾸고 싶을 때 update_traces를 쓴다.
# 'Attack vs Defense' Trace만 골라서 초록색으로 변경
fig.update_traces(
marker=dict(size=10, opacity=0.6, color='green'),
selector=dict(name='Attack vs Defense')
)
selector 옵션이 꿀기능이다. 이름을 지정해주면 해당 Trace만 콕 집어서 수정할 수 있다.
4. 축(Axis) 내 맘대로 조작하기
그래프의 완성도는 축 설정에서 나온다. 범위, 제목, 그리드 등을 세밀하게 조정해보자.
4.1 축 범위 및 제목 설정
# X축 설정
fig.update_xaxes(
range=[0, 200], # 범위 고정
title_text="Attack & HP Stats", # 축 제목
showgrid=True, # 그리드 표시
gridwidth=1,
gridcolor='lightgray'
)
4.2 축 숨기기
# Y축 설정 (숨김 처리 예시)
fig.update_yaxes(
range=[0, 150],
title_text="Defense & Speed Stats",
showgrid=False,
visible=False # 아예 축을 안 보이게 할 수도 있다
)
특정 구간만 집중해서 보여주거나, 깔끔한 디자인을 위해 축을 숨겨야 할 때 유용하다.
5. 정리
plotly.express가 ‘알아서 잘 딱 깔끔하게’ 그려준다면, graph_objects는 ‘내가 원하는 대로’ 그릴 수 있게 해준다.
| 기능 | 메서드 | 용도 |
|---|---|---|
| 객체 생성 | go.Figure() |
빈 그래프 객체 생성 |
| 데이터 추가 | add_trace() |
산점도, 선 등 데이터 레이어 추가 |
| 스타일 변경 | update_traces() |
마커 크기, 색상 등 수정 |
| 선택 수정 | selector |
특정 Trace만 골라서 수정 |
| 축 설정 | update_xaxes/yaxes |
범위, 제목, 그리드 등 축 옵션 제어 |
디테일에 익숙해지면 시각화가 훨씬 재밌어진다. 다음에는 더 복잡한 서브플롯(Subplots)도 다뤄봐야겠다.
Reference
- Dataset: Kaggle Pokemon Dataset
댓글남기기