Plotly¶
ํ์ด์ฌ์ ์ด์ฉํด ๋ฐ์ดํฐ ๋ถ์์ ํ๋ฉด์ matplotlib, seaborn์ผ๋ก ๊ทธ๋ํ๋ฅผ ๊ฐ์ฅ ๋ง์ด ๊ทธ๋ ธ๋ค. ์ด๋๋ ์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ธ์๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ๋ ์๊ฐ์ ๋ชป ํ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ค 2021๋  ์ด์ ์ธํด์ด ๋๋๊ณ ์ง์์ ๋๊ณ ์์ ๋ ์ฐ์ฐํ Plotly, Bokeh ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์๊ฒ ๋์๊ณ , ๊ทธ๋ํ๊ฐ ์์๊ฒ ๊ทธ๋ ค์ง๋๊น ํ์คํ ๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ง์ด ์๊ฒผ๋ค.
Plotly๋ก ๊ทธ๋ฆด ์ ์๋ ๊ทธ๋ํ์ ๋ํ ์ ๋ณด๋ https://plotly.com/python/ ์ด๊ณณ์์ ๋ ์ฐพ์๋ณผ ์ ์์ผ๋ฉฐ, ์ง๊ธ์ ๊ฐ๋จํ๊ฒ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๊ณ ์ ๊ธฐ๋ก์ ๋จ๊ธด๋ค.
Plotly ์ค์นํ๊ธฐ¶
# plotly ์ค์นํ๊ธฐ
pip install plotly
# ์ค์นํ๋ฉด์ ๋ฒ์ ์ ์ง์ ํ  ์๋ ์๋ค.
pip install plotly==5.2.1
# pip ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด ์ค์น๋ plotly ๋ฒ์  ์
์ ํ  ์๋ ์๋ค.
pip install plotly --upgrade
๋ง์ฝ conda prompt์์ ์ค์น๋ฅผ ์งํํ๋ค๋ฉด conda install plotly ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import plotly
print("Plotly ๋ฒ์  :", plotly.__version__)
๋จผ์  ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด ์ฌ์ฉํ ๋ฐ์ดํฐ๋ ํต๊ณ์ฒญ(https://kosis.kr/index/index.do)์์ ์ธ๊ตฌ ์ด ์กฐ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ค.
์ด ๋ฐ์ดํฐ์์ 2020๋  ์ด์ธ๊ตฌ, ๋จ์์ธ๊ตฌ, ์ฌ์์ธ๊ตฌ๋ฅผ ์๋๋ณ๋ก ๊ฐ์ ธ์๋ค.
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ 
import pandas as pd
import plotly.express as px
# 2020๋
 ์ธ๊ตฌ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
data = pd.read_excel("2020๋
 ์ธ๊ตฌ.xlsx")
data.head(5)
์์
 ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ๊ฐ์ ธ์ค๋ฉด 0๋ฒ์งธ ํ์๋ ์ปฌ๋ผ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ต์
์ผ๋ก header = 1์ ์ถ๊ฐํ๋ค.
์๋๋ฉด ์์ ๋ก ์ด์ด์ ์์ชฝ ๋ถ๋ถ์ ์์ ํด๋ ๋๋ค.
# 2020๋
 ์ธ๊ตฌ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
data = pd.read_excel("2020๋
 ์ธ๊ตฌ.xlsx", header = 1)
data.head(5)
๋ง๋ ๊ทธ๋ํ¶
๋จผ์  ๊ฐ๋จํ๊ฒ ๊ฐ ์ง์ญ๋ณ ์ด ์ธ๊ตฌ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณธ๋ค.
fig = px.bar(data,                      # ๊ทธ๋ํ์ ์ฐ์ผ ๋ฐ์ดํฐ
             x='ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)',    # x์ถ
             y='์ด์ธ๊ตฌ (๋ช
)',           # y์ถ
             title = "2020๋
 ์ด์ธ๊ตฌ")   # ์ ๋ชฉ 
fig.show()
px.bar๋ก ๊ธฐ๋ณธ์ ์ธ ๋ง๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์์ง๋ง ๋ง๋์ ์์ ๋ฐ๊พผ๋ค๊ฑฐ๋, ๋์ ๋ง๋๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋ ํ ๋ ์ถ๊ฐ์ ์ธ ์ต์ ๋ค์ ์ธ ๋๋ graph_objects๋ฅผ ์ด์ฉํ๋ ๊ฒ ๊ฐ์ graph_objects๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
import plotly.graph_objects as go
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ฌ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["์ฌ์ (๋ช
)"]), # ๊ฐ๊ฐ ๊ทธ๋ํ ์ด๋ฆ, x์ถ, y์ถ
    go.Bar(name = '2020๋
 ๋จ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["๋จ์ (๋ช
)"])
])
# ๊ทธ๋ํ์ ๋ชจ์ต์ group๋ฅผ ์ง์ ํ๋ฉด ๋ ๊ฐ๋ฅผ ์ฐ๋ฌ์ ๊ทธ๋ ค์ค๋ค.
fig.update_layout(barmode = 'group')   
fig.show()
go.Bar()์ marker_color ์ต์ ์ ์ด์ฉํ๋ฉด ๊ฐ ๋ง๋์ ์์์ ๋ฐ๊พธ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ๋๋ http://www.w3big.com/ko/tags/html-colorname.html ์ด๊ณณ์์ ์์์ ์ด๋ฆ๊ณผ ์์ ๋ณด๊ณ ๋ง์ ๋๋ ์์์ ๊ณจ๋ผ์ ์ฌ์ฉํ๋ค.
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ฌ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["์ฌ์ (๋ช
)"], marker_color = 'PowderBlue'),
    go.Bar(name = '2020๋
 ๋จ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["๋จ์ (๋ช
)"], marker_color = 'LightCoral')
])
fig.update_layout(barmode = 'group')   # ๊ทธ๋ํ์ ๋ชจ์ต์ group๋ฅผ ์ง์ ํ๋ฉด ๋ ๊ฐ๋ฅผ ์ฐ๋ฌ์ ๊ทธ๋ ค์ค๋ค.
fig.show()
์ง๊ธ๊ฐ์ ๊ฒฝ์ฐ๋ x์ถ์ ๋๊ธ์ ํ ์คํธ๊ฐ ๊ธธ์ด์ ์๊ด ์์ง๋ง, 45๋ ์ ๋๋ก ๊ธฐ์ธ์ธ x์ถ ๊ฐ๋ค์ด ์ซ์ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค. ์ด๋ด ๋๋ update_layout()์์ xaxis_tickangle ์ต์ ์ ๊ฐ๋๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ฌ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["์ฌ์ (๋ช
)"]), # ๊ฐ๊ฐ ๊ทธ๋ํ ์ด๋ฆ, x์ถ, y์ถ
    go.Bar(name = '2020๋
 ๋จ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["๋จ์ (๋ช
)"])
])
fig.update_layout(barmode = 'group',    # ๊ทธ๋ํ์ ๋ชจ์ต์ group๋ฅผ ์ง์ ํ๋ฉด ๋ ๊ฐ๋ฅผ ์ฐ๋ฌ์ ๊ทธ๋ ค์ค๋ค.
                  xaxis_tickangle=-45)  # x์ถ์ ๋๊ธ์ ๊ฐ๋๋ฅผ ์กฐ์ ํด์ ์ํ๋ ๋ชจ์ต์ผ๋ก ์ถ๋ ฅํ  ์๋ ์๋ค. 
fig.show()
์์์ ๋ ๋ง๋ ๊ทธ๋ํ๋ฅผ ์ฐ๋ฌ์์ ๊ทธ๋ ธ๋ค๋ฉด ๋น์ฐํ ๊ฒน์ณ์ ๊ทธ๋ ค๋ณด๊ณ ์ถ๊ธฐ๋ ํ๋ค. ์ด๋ด ๋๋ barmode ์ต์ ์ group์ด ์๋ stack์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ฌ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["์ฌ์ (๋ช
)"]), # ๊ฐ๊ฐ ๊ทธ๋ํ ์ด๋ฆ, x์ถ, y์ถ
    go.Bar(name = '2020๋
 ๋จ์ ์ธ๊ตฌ', x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], y = data["๋จ์ (๋ช
)"])
])
fig.update_layout(barmode = 'stack')      # ๊ทธ๋ํ์ ๋ชจ์ต์ stack์ ์ง์ ํ๋ฉด ๋ ๊ฐ๋ฅผ ๋์ ํด์ ๊ทธ๋ ค์ค๋ค.
fig.show()
๋ง์ฝ ๋ง๋ ๊ทธ๋ํ ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค์ ํด๋น ๊ฐ์ ํ์ธํ๋๊ฒ ๊ท์ฐฎ๋ค๋ฉด, ๋ง๋๊ทธ๋ํ ์์ ํด๋น ๊ฐ์ ํ ์คํธ๋ก ํํํ ์๋ ์๋ค.
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ด ์ธ๊ตฌ', 
           x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], 
           y = data["์ด์ธ๊ตฌ (๋ช
)"], 
           marker_color = 'LightSteelBlue', 
           text = data["์ด์ธ๊ตฌ (๋ช
)"])      # ํ
์คํธ๋ก ํํํ  ๊ฐ์ ์ง์  - ์ฌ๊ธฐ์  y์ถ๊ณผ ๋์ผ 
])
fig.show()
์ถ๋ ฅ๋๋ ํ ์คํธ๊ฐ ์๋ง์ง์ฐฝ์ด๋ค. ์ด๋ค ๊ฑฐ๋ ์ธ๋ก๋ก ์ถ๋ ฅ๋๊ณ , ๊ฐ๋ก๋ก ์ถ๋ ฅ๋๊ณ , ํ ์คํธ ํฌ๊ธฐ๋ ์ ๋ฉ๋๋ก.....
์ด๋ด ๋๋ ๋ ์ด์์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
fig = go.Figure(data=[
    go.Bar(name = '2020๋
 ์ด ์ธ๊ตฌ', 
           x = data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"], 
           y = data["์ด์ธ๊ตฌ (๋ช
)"], 
           marker_color = 'LightSteelBlue', 
           text = data["์ด์ธ๊ตฌ (๋ช
)"])      # ํ
์คํธ๋ก ํํํ  ๊ฐ์ ์ง์  - ์ฌ๊ธฐ์  y์ถ๊ณผ ๋์ผ 
])
fig.update_traces(texttemplate='%{text:.2s}',  # ํ์๋  ํ
์คํธ์ ํํ ์ง์ 
                  textposition='outside')      # ๋ง๋๊ทธ๋ํ ๋ฐ์ ํ
์คํธ ์ถ๋ ฅ
# ํ
์คํธ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ ๊ฐ๊ฒ ์ถ๋ ฅํ๊ณ  ์ถ์ผ๋ฉด ์ด ๋ถ๋ถ์ ์ถ๊ฐํด์ผ ํ๋ค. 
fig.update_layout(uniformtext_minsize=8,       # ์ต์ ๊ธ๊ผด ํฌ๊ธฐ ์ค์ 
                  uniformtext_mode='hide')     # ๊ธ๊ผด ํฌ๊ธฐ์ ๋ง์ง ์๋ ๋ ์ด๋ธ์ ๋ํด ์ํํ  ์์
์ ์ค์ ->show(์ค๋ฒํ๋ก์ฐ ํ์),hide(์จ๊น)
fig.show()
์ด๋ฒ์๋ ๊ฐ๋ตํ๊ฒ ๋ง๋ ๊ทธ๋ํ ๊ธฐ๋ฅ์ ๋ค๋ค๋ณผ๋ ค๊ณ ํ๋ค. 2020๋  ๋ฆฌ๊ทธ ์ค๋ธ ๋ ์ ๋ LCK Spring PoG ์ ์์ 2021๋  ๋ฆฌ๊ทธ ์ค๋ธ ๋ ์ ๋ LCK Summer PoG ์ ์๋ฅผ ํ ๋ฒ ์ฌ์ฉํด๋ณธ๋ค.
# 2021๋
 LCK Spring Player of the Game(PoG)
players = ["ShowMaker", "Pyosik", "Chovy", "Keria", "Khan", "Canyon"]
points_21 = [1000, 1000, 1000, 900, 800, 700]
# 2020๋
 LCK Summer Player of the Game(PoG)
points_20 = [1100, 300, 1000, 800, 0, 1000]
colors = ['lightslategray',] * 6   # ์์์ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
colors[0] = 'crimson'              # ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์์๋ง cromsom์ผ๋ก ๋ณ๊ฒฝํ๋ค.
fig = go.Figure(data=[go.Bar(
    x = players,
    y = points_21,
    marker_color = colors       # ๋ฆฌ์คํธ๋ฅผ ์์์ผ๋ก ์ง์ ํ๋ค.
)])
fig.update_layout(title_text='2021 LCK Spring PoG')
colors = ['lightslategray',] * 6
colors[0] = 'crimson'
fig = go.Figure(data=[go.Bar(
    x = players,
    y = points_20,
    marker_color = colors
)])
fig.update_layout(title_text='2020 LCK Summer PoG')
๋ง๋๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ค๋ณด๋ฉด ์ฃผ์ ์ฐจํธ์ฒ๋ผ ๋ฑ๋ฝ๋ฅ ? ๊ฐ์ด ํํํ๊ณ ์ถ์ ๋๋ ์๋ค. ๊ทธ๋ด ๋๋ base ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
fig = go.Figure()
fig.add_trace(go.Bar(x = players, 
                     y = points_20,
                     base = [-1100, -300, -1000, -800, 0, -1000],   # ๋ง๋๊ทธ๋ํ์ ๊ธฐ์ค์ ์ค์ ํด์ค ์ ์๋ค. -> 0์ ๊ฑธ์น๋๋ก
                     marker_color='crimson',
                     name='2020 Spring'))
fig.add_trace(go.Bar(x = players, 
                     y = points_21,
                     base=0,
                     marker_color='lightslategrey',
                     name='2021 Summer'))
fig.show()
๊ฐ๊ฐ์ ๋ง๋๊ทธ๋ํ ๋์ด๋ฅผ ์ค์ ํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅํ๋ค.
fig = go.Figure(data=[go.Bar(
    x = players,
    y = points_21,
    width = [1, 1, 1, 0.7, 0.5, 0.3] # ๊ฐ ๋ง๋๊ทธ๋ํ์ ๋์ด๋ฅผ ๋ฆฌ์คํธ์ ๋ฃ์ด์ ์ฃผ๋ฉด ๋๋ค.
)])
fig.show()
 
'๋ฐ์ดํฐ ์๊ฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| pyecharts๋ก ์ฐํฌ๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2023.02.12 | 
|---|---|
| pyecharts๋ก ํ์ด ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ (1) | 2023.01.29 | 
| pyecharts๋ก ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2023.01.27 | 
| pyecharts๋ก ๋ง๋ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2023.01.26 | 
 
                    
                   
                    
                   
                    
                  