Python 공부 기록-27

김시헌·2025년 5월 28일

Plotly 란

Plotly는 인터렉티브한 시각화가 가능한 파이썬 그래픽 라이브러리 입니다.

기본적인 시각화부터 통계, 재무, 지리 과학 및 3-dimensional 을 포함한 40개 이상의 차트 타입을 제공하는 오픈소스 입니다. 기본적으로 쥬피터 노트북에 시각화가 가능하며 인터렉티브한 dashboards 위해 Dash 또는 Chart Studio와 같은 라이브러리와 통합 및 확장이 가능합니다.

특징

  • Interactive 한 시각화 가능하여 사용자가 시각화된 그래프를 쉽게 줌인, 줌아웃 및 툴팁을 활용한 데이터확인이 가능합니다. (Matplotlib/Seaborn 과의 가장 큰 차이점)
  • Dash, 및 chart Studio 와같은 visualisation tools 연동으로 Web 및 application 통해 확인이 가능합니다.

Dash 란?

  • Dash는 Flask, Plotly.js 및 React.js 위에 작성된 Python 웹서비스 개발용 프레임워크로 Plotly에 기반하고 있습니다.

  • Dash는 Python과 HTML을 이용하여 쉽게 웹사이트나 대시보드 같은 대화형 웹응용프로그램을 작성할 수 있습니다.

Chart Studio 란?

Chart Studio란 Plotly에서 개발한 서비스로 웹을 기반으로 Plotly 그래프 생성 및 Raw 데이터 수정까지 가능하게 한 서비스 입니다.

  • matplotlib 대비 코드가 훨씬 간편합니다.(이 벨로그를 통해 익숙해진다면)
  • Python 뿐만 아니라 R, Julia, MATLAB 등과 같은 다른 프로그래밍 언어를 스크립트를 사용하여 이용이 가능합니다.
    -Plotly는 기본적으로 JSON(JavaScript Object Notation) 형태를 주고받는 구조로 되어있습니다. 하지만 걱정 하실필요 없습니다. 본 책에서는 복잡한 JSON 형태가 아닌 직관적인 객체를 사용하는 방법으로 진행할 예정입니다.
    -Matplotlib 차트를 Plotly 차트로 변화나는 기능이 지원됩니다.
    -Pandas와의 호환 기능이 추가되어 판다스 plotting 백엔드에 Plotly를 설정하면 Padas 데이터프레임에서 바로 Plotly 로 시각화가 가능합니다.
    -기본적인 색감이 매우 이쁩니다.(개인적인 취향)
    -라이센스가 무료 입니다.

실습을 위한 개발환경 설정

기본 사용방법은 온라인 오프라인 두가지가 있는데 우리는 쥬피터 노트북 환경에서 시각화를 할 예정으로 오프라인 상태 개발환경 설정방법에 대해 알아보도록 하겠습니다.

Plotly 설치하기

Plotly 라이브러리는 아나콘다 프롬프트(Anaconda Prompt) 또는 명령 프롬프트를 통해서 설치할 수 있습니다. 아나콘다 프롬프트를 열었다면 아나콘다 프롬프트에 아래의 커맨드를 입력하여 Plotly 를설치합니다.

>pip install plotly==5.11.0

주피터 노트북(Jupyter Notebook) 설치하기

주피터 노트북은 웹에서 코드를 작성하고 실행할 수 있는 오픈소스 웹 어플리케이션입니다. 이 책의 모든 코드들은 기본적으로 본인의 컴퓨터에 설치된 주피터 노트북에서 사용한다고 가정합니다. 주피터 노트북도 아나콘다를 설치하면 자동으로 설치되어져 있습니다. 아나콘다를 설치하지 않았다면 아래의 커맨드로 Jupyter notebook을 별도 설치할 수 있습니다.

>pip install jupyter

설치가 완료되었으면 프롬프트에서 다음 명령어를 통해 주피터 노트북을 실행할 수 있습니다.

>jupyter notebook

해당 명령어를 치면 웹 브라우저가 자동으로 열리면서 주피터 노트북이 실행됩니다. 만약 실행되지 않는다면, 직접 실행시켜야 합니다. 웹 브라우저를 열고 프롬프트에서 나오고 있는 주소인 "localhost:8888"에 접속합니다.

아나콘다와(Anaconda)와 쥬피터 노트북(Jupyter Notebook)

Plotly Tutorial 위해서는 몇가지 패키지가 필요합니다. 이를 일일히 설치하는 것보다는 필요한 패키지들을 모아놓은 파이썬 배포판 '아나콘다'를 설치하는 것을 권장합니다. 아나콘다는 Numpy, Pandas, Jupyter Notebook 등 이 책에서 사용할 대부분의 패키지를 전부 포함하고 있습니다.

여기서는 윈도우 환경을 기준으로 두고 아나콘다를 설치하는 방법과 Jupyter Notebook 설치 방법에 대해 설명드립니다.

아나콘다(Anaconda) 설치

링크 : https://www.anaconda.com/products/distribution/

위 사이트 링크로 이동하여 우측 상단에 (저자가 이 책을 작성할 당시 기준) 파이썬 3.9 아나콘다 설치 파일이 있습니다. 여기서는 파이썬 3.9 버전 64 비트를 설치합니다.


설치 파일을 실행한 후에 다른 윈도우 프로그램을 설치하는 것과 마찬가지로 Next > 를 누르면서 설치를 완료하면 됩니다. 아나콘다를 설치하면 머신 러닝을 위한 기본적인 파이썬 패키지들은 자동으로 설치가 됩니다. 다만 텐서플로우, 케라스, 젠심, 코엔엘파이와 같은 패키지들은 별도 설치가 필요한데 이에 대해서는 뒤에서 추가적으로 설명하겠습니다.

아나콘다를 다 설치했다면 아나콘다 프롬프트를 오픈하겠습니다.

아나콘다 프롬프트를 열었다면 아나콘다 프롬프트에 아래의 커맨드를 입력하여 아나콘다 파이썬 패키지를 전부 최신 버전으로 업데이트 합니다.

> conda update -n base conda
> conda update --all

주피터 노트북 설치

주피터 노트북은 웹에서 코드를 작성하고 실행할 수 있는 오픈소스 웹 어플리케이션입니다. 이 책의 모든 코드들은 기본적으로 본인의 컴퓨터에 설치된 주피터 노트북에서 사용한다고 가정합니다. 주피터 노트북도 아나콘다를 설치하면 자동으로 설치되어져 있습니다. 아나콘다를 설치하지 않았다면 아래의 커맨드로 Jupyter notebook을 별도 설치할 수 있습니다.

>pip install jupyter

설치가 완료되었으면 프롬프트에서 다음 명령어를 통해 주피터 노트북을 실행할 수 있습니다.

>jupyter notebook

해당 명령어를 치면 웹 브라우저가 자동으로 열리면서 주피터 노트북이 실행됩니다. 만약 실행되지 않는다면, 직접 실행시켜야 합니다. 웹 브라우저를 열고 프롬프트에서 나오고 있는 주소인 "localhost:8888"에 접속합니다.

라이브러리 설치

아나콘다를 설치했다면 기본적으로 Numpy, Pandas, Jupyter notebook, 등이 이미 설치되어져 있습니다. 그래서 아나콘다에 포함되어있지 않은 Plotly, Kaleido , Statsmodels 과 같은 패키지만 별도로 pip를 통해 설치합니다.

하지만 컴퓨터에 아나콘다를 설치하지 않고 단순히 파이썬만 설치된 상태라면 위에서 언급한 모든 패키지를 pip로 설치해야 합니다. 여기서는 윈도우 환경을 기준으로 설명합니다.

Plotly 설치하기

Plotly 라이브러리는 아나콘다 프롬프트(Anaconda Prompt) 또는 명령 프롬프트를 통해서 설치할 수 있습니다. 아나콘다 프롬프트를 열었다면 아나콘다 프롬프트에 아래의 커맨드를 입력하여 Plotly 를설치합니다.

> pip install plotly==5.11.0

Kaleido 설치하기

그림파일로 추출을 하려면 kaleido라는 별도의 패키지 설치가 필요합니다. Kaleido

> pip install kaleido

Statsmodels 설치하기

추세선 기능을 활용하기 위해선 statsmodels 패키지를 추가 설치해야 합니다. statsmodels

> pip install statsmodels

Plotly 기초 그래프 생성하기

Plotly를 활용해서 그래프를 그리는 다양한 방법 중 가장 많이 사용되는 2가지 방법에 대해 소개합니다.

본 내용에서는 2가지 방법 사용법에 대해 모두 자세히 설명 합니다. 경우에 따라서는 두가지 방법을 융합하여 빠르고 가시성이 뛰어난 시각화 코딩 방법에 대해서도 학습 합니다.

아래의 막대 그래프를 2가지 방법을 활용하여 시각화 하는 방법에 대해 알아 보겠습니다.

graph_objects 모듈을 활용한 생성

그래프를 하나하나 설명하고 직접 지정하며 제작하는 방법입니다.

예제)

# graph_objects 패키지를  go 로 불러옴
import plotly.graph_objects as go

# go.Figure() 함수를 활용하여 기본 그래프를 생성
fig = go.Figure(
    # Data 입력
    data=[go.Bar(x=[1, 2, 3], y=[1, 3, 2])],
    # layout 입력
    layout=go.Layout(
        title=go.layout.Title(text="A Figure Specified By A Graph Object")
    )
)
#show하면 내 노트북 (주피터 노트북 등)에 그래프가 나타남.
fig.show()

1)패키지 불러오기

import plotly.graph_objects as go

graph_objects 를 사용하기 위해 먼저 개발환경에 graph_objects 를 go 라는 별칭으로 불러옵니다.

2)Figure 생성

fig = go.Figure(
    # Data 입력
    data=[go.Bar(x=[1, 2, 3], y=[1, 3, 2])],
    # layout 입력
    layout=go.Layout(
        title=go.layout.Title(text="A Figure Specified By A Graph Object"))
    )
fig.show()

Figure는 Plotly 작업의 기본 단위 입니다. Figure는 go.Figure() 함수를 통해 생성이 가능합니다. 이때 go.Figure 힘수의 구조는 아래와 같습니다. data와 layout 총 2개를 input으로 받는 구조입니다.

data

data는 일명 "Trace" 를 Python List 형태로 받습니다. Trace는 그리고자 하는 그래프의 타입(ex. Bar, Scatter, Line, Box..)과 그 그래프에 시각화 하고자 하는 Raw 데이터를 품고있는 단위 입니다.

예를들면 위의 예제에서는 go.Bar(x=[1, 2, 3], y=[1, 3, 2]) 가 하나의 Trace가 됩니다. 리스트 형태로 받는 이유는 하나의 Figure에 다양한 Trace를 동시에 시각화를 하기위헤 리스트 형태로 받습니다.

layout

그래프의 data와는 무관하고 그외 모든 부분을 편집 및 가공하는 부분입니다. Title, legend, Colors, Hover-label, Axes, Shape 등 그래프 등 시각화를 높히기 위한 다양한 도구들은 모두 layout을 통해 지정합니다.

3)Figure 랜더링

fig.show()

Figure를 받은 객체에 show() 함수를 마지막에 작성하면 랜더링 과정을 통해 내 주피터 노트북 출력 셀에 그래프가 나타납니다.

express 모듈을 활용한 그래프 생성

그래프를 이미 제작되어있는 템플릿으로 빠르게 제작하는 방법으로 매우 짧은 코드만으로 양질의 그래프를 제작할수있는 high-level 모듈 입니다.

graph_objects 모듈과 express 모듈은 Matplotlib과 Seaborn 의 사이와 같습니다. Matplotlib 를 기반으로 만들어진 Seaborn 이미 만들어진 템플릿을 활용하여 더 쉽게 사용이 가능하듯이 express 또한 graph_objects 로 제작이 된 모듈로 사용이 더욱 쉽습니다.

또하나 비슷한 점은 Seaborn 을 Matplotlib의 문법을 활용해서 튜닝이 가능하듯 express 또한 graph_objects의 기능인 add_trace(), update_layout(), update_traces() 기능을 활용하여 세세한 튜닝이 가능합니다. "Todo" 링크 연결

예제)

# express 패키지를  px로 불러옴
import plotly.express as px

# px.bar() 함수를 활용해서 bar chart 생성과 동시에 Data, Layout 값 입력
fig = px.bar(x=["a", "b", "c"], y=[1, 3, 2],title="A Figure Specified By express")

#show하면 내 노트북 (주피터 노트북 등)에 그래프가 나타남.
fig.show()

실행 결과

1) 패키지 불러오기

 import plotly.express as px

express 를 사용하기 위해 먼저 개발환경에 express 를 px 라는 별칭으로 불러옵니다.

2) Figure 생성

fig = px.bar(x=["a", "b", "c"], y=[1, 3, 2],
            title="A Figure Specified By express")

px.bar 를 활용해서 바로 그래프의 타입을 bar로 지정하고, x, y 에 각각 데이터를 넣어줍니다. 마지막으로 title 또한 펑션안에서 바로 넣어주어서 매우 짧은 코드만으로 Figure 제작을 완료하였습니다.

지금 현재 px.bar 와 같이 express 를 통해 제작된 템플릿은 아래와 같습니다.

  • Basics: scatter, line, area, bar, funnel, timeline
  • Part-of-Whole: pie, sunburst, treemap, icicle, funnel_area
  • 1D Distributions: histogram, box, violin, strip, ecdf
  • 2D Distributions: density_heatmap, density_contour
  • Matrix or Image Input: imshow
  • 3-Dimensional: scatter_3d, line_3d
  • Multidimensional: scatter_matrix, parallel_coordinates, parallel_categories
  • Tile Maps: scatter_mapbox, line_mapbox, choropleth_mapbox, density_mapbox
  • Outline Maps: scatter_geo, line_geo, choropleth
  • Polar Charts: scatter_polar, line_polar, bar_polar
  • Ternary Charts: scatter_ternary, line_ternary

3) Figure 랜더링

fig.show()

Figure를 받은 객체에 show() 함수를 마지막에 작성하면 랜더링 과정을 통해 내 주피터 노트북 출력 셀에 그래프가 나타납니다.

각 방법의 장단점 및 활용방안

2가지 방법은 아래의 표와 같은 장단점이 있습니다.

  • express는 사용자가 빠르게 데이터 분석을 진행할때 활용을 추천합니다.
  • graph_objects 는 논문, 발표자료와 같이 그래프 visualization에 중점을 두었을 경우 활용을 추천합니다.

Ploty 그래프 업데이트 기초문법

Plotly에서 그래프를 그리는 가장 보편적인 방법은 아래 그림과 같이 기초 그래프를 생성 후 다양한 방법으로 그래프를 업데이트하는 2단계를 거치는 방법입니다. 이번 장에서는 2번째 단계인 그래프를 업데이트 하는 5가지의 함수 기능에 대해 간략히 설명드리겠습니다.

앞으로 진행 될 Plotly 기본 문법 및 여러 그래프들은 대부분 지금부터 소개 해 드릴 5개의 함수를 활용한 Plotly 그래프 튜닝 과정이라고 볼 수 있습니다.

Keyword : Plotly update_layout, Plotly add_trace, Plotly update_traces, Plotly update_xaxes, Plotly update_yaxes,

add_trace()

fig.add_trace(추가할 Trace 입력)

add_trace() 함수를 활용하면 Figure에 새로운 Trace를 추가 가능합니다. ex) go.Scatter, go.Bar...등등

예제 1) 빈 Figure 에 Trace 추가하기

import plotly.graph_objects as go

fig = go.Figure()

fig.add_trace(go.Bar(x=[1, 2, 3], y=[1, 3, 2]))

fig.show()

실행 결과

예제 2) 이미 Trace가 있는Figure에Trace 추가하여 겹쳐 그리기

import plotly.express as px

# 데이터 불러오기
df = px.data.iris()

# express를 활용한 scatter plot 생성
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species",
                 title="Using The add_trace() method With A Plotly Express Figure")

fig.add_trace(
    go.Scatter(
        x=[2, 4],
        y=[4, 8],
        mode="lines",
        line=go.scatter.Line(color="gray"),
        showlegend=False)
)

fig.show()

실행 결과

이미 생성된 scatterplot 위에 직선의 그래프를 add_trace()를 활용해서 추가합니다.

update_trace()

fig.update_traces(업데이트 내용)

update_trace() 함수를 사용하면 이미 생성된 trace의 type, 색, 스타일, 템플릿 등 추가 편집이 가능합니다. 물론 처음 Trace를 생성할 때 스타일 지정을 해서 생성이 가능하지만 update_trace 를 활용하면 한번에 모든 Trace의 스타일 업데이트가 가능하여 코드의 길이를 줄일 수 있으며 가독성이 높은 코드구현을 위해 Trace 생성부 와 Trace 편집부를 나눠서 작성 가능하게 합니다.

예제)

from plotly.subplots import make_subplots

# subplot 생성
fig = make_subplots(rows=1, cols=2)

# Trace 추가하기
fig.add_scatter(y=[4, 2, 3.5], mode="markers",
                marker=dict(size=20, color="LightSeaGreen"),
                name="a", row=1, col=1)

fig.add_bar(y=[2, 1, 3],
            marker=dict(color="MediumPurple"),
            name="b", row=1, col=1)

fig.add_scatter(y=[2, 3.5, 4], mode="markers",
                marker=dict(size=20, color="MediumPurple"),
                name="c", row=1, col=2)

fig.add_bar(y=[1, 3, 2],
            marker=dict(color="LightSeaGreen"),
            name="d", row=1, col=2)

# 한번에 Bar plot 만 파란색으로 바꾸기
fig.update_traces(marker=dict(color="RoyalBlue"),
                  selector=dict(type="bar"))

fig.show()

실행 결과

  • 총 4개의 Trace를 생성하였습니다.
  • update_traces() 를 활용하여 4개 중 Barplot만 RoyalBlue 색으로 한번에 변경하였습니다.

update_layout()

fig.update_layout(업데이트 내용)

update_layout() 함수를 사용하면 그래프 사이즈, 제목 및 텍스트, 글꼴크기 와 같은 Trace 외적인 그래프 요소를 업데이트 가능합니다.

예제)

import plotly.graph_objects as go

#그래프 생성
fig = go.Figure(data=go.Bar(x=[1, 2, 3], y=[1, 3, 2]))

# 타이틀 추가하기
fig.update_layout(title_text="Using update_layout() With Graph Object Figures",title_font_size=30)

fig.show()

실행 결과

  • update_layout() 를 활용하여 타이틀을 추가하였습니다.

update_xaxes() / update_yaxes()

fig.update_xaxes(업데이트 내용)
fig.update_yaxes(업데이트 내용

update_xaxes(), update_yaxes() 함수를 사용하면 각각 X축, Y축에 관한 다양한 편집이 가능합니다. ex) 축 타이틀, 축 라인 스타일, 그리드 설정 등

예제)

import plotly.graph_objects as go
import plotly.express as px

#데이터 생성
df = px.data.tips()
x = df["total_bill"]
y = df["tip"]

# 그래프 그리기
fig = go.Figure(data=go.Scatter(x=x, y=y, mode='markers'))

# 축 타이틀 추가하기
fig.update_xaxes(title_text='Total Bill ($)')
fig.update_yaxes(title_text='Tip ($)')

fig.show()

실행 결과

  • update_xaxes(), update_yaxes() 를 활용하여 축 타이틀을 추가하였습니다.

실습 데이터셋 설명

Plotly와 Seaborn에서는 학습자들의 실습을 돕기위해 다양한 데이터셋을 제공합니다.

본 책에서는 Plotly와 Seaborn 제공 데이터셋을 Pandas의 데이터프레임 형태로 불러와서 시각화를 진행 할 예정입니다.

Seaborn 제공 데이터셋

Seaborn은 아나콘다 프롬프트(Anaconda Prompt) 또는 명령 프롬프트를 통해서 설치할 수 있습니다. 아나콘다 프롬프트를 열었다면 아나콘다 프롬프트에 아래의 커맨드를 입력하여 텐서플로우를 설치합니다.

> pip install seaborn

Plotly 기본 문법

다양한 타입의 그래프를 배우기 전에 Plotly의 기본 문법에 대해 알아보겠습니다.

Ploty 그래프 사이즈 설정하기


Plotly의 각각의 그래프 생성방법에(express, graph_object ) 따라 그래프 사이즈 및 Margin 설정 방법에 대해 알아봅니다.

Keyword : Plotly 그래프 사이즈, Plotly graph size ,Plotly 그래프 마진, Plotly graph margin , Plotly width, Plotly height

기본 사용

1) express 그래프

import plotly.express as px
fig = px.bar(x=["a", "b", "c"], y=[1, 3, 2],width=600, height=400)
fig.show()

실행 결과

[사용 함수]

  • fig.update_layout ()

[함수 input 내용]

  • width : 가로 길이(픽셀 단위)
  • height : 세로 길이(픽셀 단위)

Margine 적용 방법

margin 이란 전체 크기(Figure) 와 그래프(Trace) 사이의 거리를 뜻합니다.

예시)

fig.update_layout(
        margin_l=left margine,
        margin_r=right margine,
        margin_b=right margine,
        margin_t=top margine)

[사용 함수]

  • fig.update_layout ()

[함수 input 내용]

  • margin_l = left margine
  • margin_r = right margine
  • margin_b = bottom margine
  • margin_t = top margine

예제) 그래프 크기와 margin을 한번에 조절해보겠습니다.

import plotly.express as px

fig = px.bar(x=["a", "b", "c"], y=[1, 3, 2])

# 그래프 크기와 margin 설정하기

fig.update_layout(
    width=600,
    height=400,
    margin_l=50,
    margin_r=50,
    margin_b=100,
    margin_t=100,
    # 백그라운드 칼라 지정, margin 잘 보이게 하기위함
    paper_bgcolor="LightSteelBlue",
)

fig.show()

실행 결과

0개의 댓글