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 |