iBetter Books
수정

Matplotlib vs Plotly

지윤은 캡스톤 미팅을 마치고 연구실로 돌아와 노트북을 폈습니다. 지난 한 학기 인턴에서 Matplotlib으로 만든 그래프들이 저장 폴더에 가득 쌓여 있었습니다. 괜찮은 그래프들이었습니다. 그런데 교수님 말씀이 계속 머릿속을 맴돌았습니다.

"심사위원들이 직접 데이터를 탐색할 수 없어요."

지윤은 Plotly 공식 문서를 열었습니다. 첫 예제를 실행했더니 브라우저에서 차트가 열렸습니다. 마우스를 올리자 값이 뜨고, 드래그하자 줌이 됐습니다. 별도 설정이 없었는데도 말입니다.

"아, 이게 다르구나."

철학의 차이

Matplotlib과 Plotly는 만들어진 목적 자체가 다릅니다.

Matplotlib은 MATLAB의 그래픽 시스템을 파이썬으로 옮기는 것을 목표로 2002년에 시작되었습니다. 종이에 인쇄될 논문 그래프, 발표 자료 이미지, PNG/SVG 파일 출력이 핵심이었습니다. 정밀한 제어가 가능하고 결과물의 완성도가 높습니다. 대신 "움직임"은 나중에 덧붙인 기능입니다.

Plotly는 2012년 웹 브라우저용 인터랙티브 차트 서비스로 출발했습니다. 내부적으로 자바스크립트 라이브러리인 Plotly.js를 사용하고, 파이썬 코드로 그 위에 앉아있는 형태입니다. HTML과 자바스크립트가 기반이기 때문에 마우스 호버, 줌, 필터, 애니메이션이 기본으로 내장되어 있습니다.

항목 Matplotlib Plotly
출시 목적 정적 그래프 (논문, 인쇄물) 인터랙티브 차트 (웹, 대시보드)
출력 형식 PNG, SVG, PDF HTML, JSON
인터랙션 별도 설정 필요 기본 내장
학습 곡선 낮음 (pyplot) / 높음 (객체지향) 낮음 (Express) / 중간 (Graph Objects)
커스터마이징 매우 세밀 세밀 (단, 방식이 다름)
대시보드 연동 어려움 Dash와 자연 연동

같은 데이터, 두 가지 방법

월별 기온 데이터를 두 라이브러리로 각각 그려보겠습니다. 어떻게 다른지 직접 눈으로 확인하는 것이 가장 빠릅니다.

먼저 Matplotlib 버전입니다.

# 새 파일: matplotlib_example.pyimport matplotlib.pyplot as pltmonths = ["1월", "2월", "3월", "4월", "5월", "6월",          "7월", "8월", "9월", "10월", "11월", "12월"]temperatures = [2.1, 4.3, 9.8, 15.6, 20.2, 24.7,                27.9, 28.4, 23.1, 16.5, 9.3, 3.2]plt.figure(figsize=(10, 5))plt.plot(months, temperatures, marker="o", color="steelblue", linewidth=2)plt.title("서울 월별 평균 기온 (2024)")plt.xlabel("월")plt.ylabel("기온 (°C)")plt.grid(True, alpha=0.3)plt.tight_layout()plt.show()

이 코드는 PNG 이미지를 출력합니다. 마우스를 올려도 아무 반응이 없습니다. 특정 달의 값이 궁금하면 눈으로 y축을 따라가야 합니다.

이번에는 같은 데이터를 Plotly로 그려보겠습니다.

# 새 파일: plotly_example.pyimport plotly.express as pxmonths = ["1월", "2월", "3월", "4월", "5월", "6월",          "7월", "8월", "9월", "10월", "11월", "12월"]temperatures = [2.1, 4.3, 9.8, 15.6, 20.2, 24.7,                27.9, 28.4, 23.1, 16.5, 9.3, 3.2]fig = px.line(    x=months,    y=temperatures,    title="서울 월별 평균 기온 (2024)",    labels={"x": "월", "y": "기온 (°C)"},    markers=True)fig.show()

코드 길이는 비슷합니다. 그런데 결과물이 다릅니다. 브라우저에 차트가 열리고, 마우스를 각 점 위에 올리면 정확한 값이 팝업으로 뜹니다. 우상단 툴바로 줌, 이동, 초기화가 가능합니다. PNG로 저장하는 버튼도 내장되어 있습니다.

Plotly Express와 Graph Objects

Plotly에는 두 가지 인터페이스가 있습니다. 처음에는 헷갈릴 수 있으니 명확히 구분해두겠습니다.

Plotly Express (plotly.express, 줄여서 px)

빠르고 간결합니다. DataFrame을 넘기면 알아서 그려줍니다. 대부분의 경우 이것으로 충분합니다.

# 새 파일: px_demo.pyimport plotly.express as pximport pandas as pddf = pd.DataFrame({    "월": ["1월", "2월", "3월", "4월", "5월", "6월"],    "기온": [2.1, 4.3, 9.8, 15.6, 20.2, 24.7],    "강수량": [21, 35, 45, 75, 93, 108]})# 선 차트 한 줄fig = px.line(df, x="월", y="기온", title="월별 기온")fig.show()

Graph Objects (plotly.graph_objects, 줄여서 go)

더 세밀한 제어가 필요할 때 사용합니다. 트레이스(trace)와 레이아웃을 직접 조립하는 방식입니다. Plotly Express로 만든 차트도 내부적으로는 Graph Objects로 구성되어 있습니다.

# 새 파일: go_demo.pyimport plotly.graph_objects as gofig = go.Figure()fig.add_trace(go.Scatter(    x=["1월", "2월", "3월", "4월", "5월", "6월"],    y=[2.1, 4.3, 9.8, 15.6, 20.2, 24.7],    mode="lines+markers",    name="기온",    line=dict(color="steelblue", width=2)))fig.update_layout(    title="월별 기온",    xaxis_title="월",    yaxis_title="기온 (°C)")fig.show()

이 교재에서는 Express로 시작해서 Graph Objects로 점진적으로 넘어갑니다. 처음부터 Graph Objects를 배울 필요가 없습니다.

언제 무엇을 쓸까.

두 라이브러리는 경쟁 관계가 아닙니다. 상황에 따라 선택하면 됩니다.

상황 추천
논문, 학술지 제출용 그래프 Matplotlib
발표 자료에 들어갈 고품질 이미지 Matplotlib
데이터 탐색, 패턴 발견 Plotly
웹에 올릴 인터랙티브 차트 Plotly
팀원이나 클라이언트와 공유할 대시보드 Plotly + Dash
이미 Seaborn 코드가 있는데 빠르게 개선 Seaborn 유지

지윤의 캡스톤 프로젝트는 명확합니다. 심사위원이 직접 탐색할 수 있는 인터랙티브 대시보드. 정답은 Plotly입니다.

다음 파일에서는 환경을 설치하고 첫 번째 차트를 실행해보겠습니다.