Pyecharts¶
๊ตฌ๊ธ์ Pyecharts๋ฅผ ๊ฒ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํ์ง๋ฐฅ์ ๋ณผ ์ ์๋ค.
Pyecharts๋ฅผ ์ด์ฉํด ๊ทธ๋ฆด ์ ์๋ ๊ทธ๋ํ๋ค์ด ๊ถ๊ธํ๋ค๋ฉด https://github.com/pyecharts/pyecharts-gallery ์ด๊ณณ์ ๋ฐฉ๋ฌธํด์ ์ดํด ๋ณด๋ฉด ๋๋ค.
์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ์ด์ ๋ ๋จ์ํ๋ค. ๋์ค์ ์ฝ๊ฒ ๋ง๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค.
# pyecharts ์ค์น๋ ๋น๊ต์ ์ฝ๋ค.
!pip install pyecharts
# pyecharts ๋ฒ์ ํ์ธํ๊ธฐ
import pyecharts
print("Pyecharts ๋ฒ์ :", pyecharts.__version__)
๋จผ์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ํ์ํ ๋ฐ์ดํฐ๋ ํต๊ณ์ฒญ(https://kosis.kr/index/index.do)์ ์ธ๊ตฌ ์ด ์กฐ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ค.
์ด ํต๊ณ์์ ๋๋ 2020๋ ์ด์ธ๊ตฌ, ๋จ์์ธ๊ตฌ, ์ฌ์์ธ๊ตฌ๋ฅผ ์๋๋ณ๋ก ๊ฐ์ ธ์๋ค.
# ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import pandas as pd
import numpy as np
# ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ทธ๋ํ๋ฅผ ๋ถ๋ฌ์จ๋ค.
from pyecharts.charts import Bar, Line
# ๊ทธ๋ํ ์ต์
์ ์ค์ ํ๊ธฐ ์ํด ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from pyecharts import options as opts
# ์์
๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ๊ฐ์ ธ์ค๋ฉด 0๋ฒ์งธ ํ์๋ ์ปฌ๋ผ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ต์
์ผ๋ก header = 1์ ์ถ๊ฐํ๋ค.
data = pd.read_excel("2020๋
์ธ๊ตฌ.xlsx", header = 1)
data.head(5)
Pyecharts를 이용할 때 중요한 점은 그래프에 전달할 데이터는 꼭 리스트로 변경해서 전달해야 한다.¶
# ๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝ
x = list(data["ํ์ ๊ตฌ์ญ๋ณ(์๋ฉด๋)"])
y = list(data["์ด์ธ๊ตฌ (๋ช
)"])
bar = (
Bar()
.add_xaxis(x) # x์ถ
.add_yaxis("์ด์ธ๊ตฌ", y) # y์ถ
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ", # ์ ๋ชฉ
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ")) # ์ ๋ชฉ ์๋ ์์ ๋ชฉ
.render_notebook() # ์ฃผํผํฐ ๋
ธํธ๋ถ์ ๊ทธ๋ํ๋ฅผ ์ถ๋ ฅ
)
bar
๋ง๋ ๊ทธ๋ํ๋ ์์๊ฒ ๊ทธ๋ ค์ก์ง๋ง ๊ทธ๋ํ ์์ ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๊ฐ ์กฐ๊ธ ๊ฑฐ์ฌ๋ฆฐ๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False) # label_opts = False ์ต์
์ผ๋ก ๋ฐ์ดํฐ ์ถ๋ ฅ์ offํ๋ค.
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook() # ๊ทธ๋ํ๋ฅผ HTML๋ก ๋ค์ด๋ฐ๊ณ ์ถ๋ค๋ฉด bar.render("boxplot_base.html")๋ก ๋ฐ๊ฟ์ ์คํํ๋ฉด ๋๋ค.
)
bar
๋ด๊ฐ ์ํ๋ ํํ๋ก ๊ทธ๋ํ๊ฐ ๊ทธ๋ ค์ก์ง๋ง ๋นจ๊ฐ์์ ์ข ๋ถ๋ด์ค๋ฝ๋ค. ๊ทธ๋์ ์์ ๋ณ๊ฒฝํ์.
http://www.w3big.com/ko/tags/html-colorname.html ์ด๊ณณ์์ HTML ์์์ ๋ณด๊ณ ๋ง์ ๋๋ ์์์ ์ ํํ๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal") # color ์ต์
์ ์ํ๋ ์์ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋๋ค.
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
bar
์ฒ์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด x์ถ๊ณผ y์ถ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๋ค๋ ์๋ค. ๊ทธ๋ด ๋๋ x์ถ๊ณผ y์ถ์ ์ด๋ฆ์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal") # color ์ต์
์ ์ํ๋ ์์ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋๋ค.
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ"), # ์์ ๋ชฉ์ด๋ Y์ถ ์ ๋ชฉ์ด๋ ๊ฒน์ณ์ ์ ๊ฑฐ
yaxis_opts = opts.AxisOpts(name = "Y์ถ ์ ๋ชฉ"), # X์ถ ์ด๋ฆ
xaxis_opts = opts.AxisOpts(name = "X์ถ ์ ๋ชฉ"), # Y์ถ ์ด๋ฆ
)
.render_notebook()
)
bar
์์ ๋น์ทํ ์ด์ ๋ก ์ฝ๊ฒ ๊ทธ๋ํ๋ฅผ ์ดํด์ํค๊ธฐ ์ํด y์ถ ๋๊ธ์ ๋จ์๋ฅผ ๋ฃ์ด์ค ์๋ ์๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal")
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ"),
yaxis_opts = opts.AxisOpts(axislabel_opts = opts.LabelOpts(formatter="{value} (๋ช
)")), # Y์ถ ๋๊ธ ํฌ๋งท
)
.render_notebook()
)
bar
๋ด๊ฐ ์ํ๋ ๋ง๋๊ทธ๋ํ๋ง ๋ณด๊ณ ์ถ๋ค๋๊ฐ, ์ถฉ์ฒญ๋จ๋๋ ์ ๋ผ๋จ๋๋ง ๋น๊ตํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ๊ทธ๋ํ ์ค/์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal")
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"),
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")]) # ๊ทธ๋ํ๋ฅผ ์ค/์์ ํ ์ ์๋ค.
.render_notebook()
)
bar
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal")
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"),
toolbox_opts = opts.ToolboxOpts(), # ๊ทธ๋ํ ์ค๋ฅธ์ชฝ ์์ ํด๋ฐ์ค๋ฅผ ์์ฑํ๋ค.
legend_opts=opts.LegendOpts(is_show=False))
.render_notebook()
)
bar
๋ง๋ ๊ทธ๋ํ์ ์ง๋์ฒ๋ผ ๋งํฌํฌ์ธํธ๋ ์ถ๊ฐํ ์ ์๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False, color = "Teal",
markpoint_opts = opts.MarkPointOpts(data = [opts.MarkPointItem(name = "๋ถ์ฐ", # ๋งํฌํฌ์ธํธ ์ด๋ฆ
coord=[x[2], y[2]], # ๋งํฌํฌ์ธํธ ์์น
value="๋ถ์ฐ")])) # ๋งํฌํฌ์ธํธ ๊ฐ
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
bar
์ด๋ฒ์ ๋จ์ ์ธ๊ตฌ์ ์ฌ์ ์ธ๊ตฌ๋ฅผ ํ ๊ทธ๋ํ์ ํํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
# ๋จผ์ ๋ฆฌ์คํธ๋ก ๋ฐ์ดํฐ ์ง์
man = list(data["๋จ์ (๋ช
)"])
woman = list(data["์ฌ์ (๋ช
)"])
# ์ฝ๋๋ ๊ฐ๋จํ๋ค. bar ๊ทธ๋ํ๋ฅผ ํ๋ ๋ ์ถ๊ฐํ๋ฉด ๋๋ค.
double_bar = (
Bar()
.add_xaxis(x) # x์ถ
.add_yaxis("๋จ์ ์ธ๊ตฌ", man, label_opts = False, color = "SlateBlue") # y์ถ1
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman, label_opts = False, color = "HotPink") # y์ถ2
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ฑ๋ณ ์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
double_bar
double_bar = (
Bar()
.add_xaxis(x) # x์ถ
.add_yaxis("๋จ์ ์ธ๊ตฌ", man, label_opts = False, color = "SlateBlue", gap="0%") # gap ์ต์
์ผ๋ก ๋ง๋๊ทธ๋ํ ์ฌ์ด ๊ฐ๊ฒฉ์ ์กฐ์ ํ๋ค.
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman, label_opts = False, color = "HotPink", gap="0%")
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ฑ๋ณ ์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
double_bar
๋ ๊ทธ๋ํ๋ฅผ ์ฐ๋ฌ์ ๋ณด๋๊ฒ ์๋๋ผ ๋์ ์ผ๋ก ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์ต์ ์ ์ถ๊ฐํด์ฃผ๋ฉฐ ๋๋ค.
double_bar = (
Bar()
.add_xaxis(x) # x์ถ
.add_yaxis("๋จ์ ์ธ๊ตฌ", man, label_opts = False, color = "SlateBlue", stack="stack") # stack ์ต์
์ผ๋ก ๋์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๋ค.
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman, label_opts = False, color = "HotPink", stack="stack")
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ฑ๋ณ ์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
double_bar
# 3๊ฐ๋ ๊ทธ๋ฆด ์ ์๋ ํด๋ดค๋ค.
triple_bar = (
Bar()
.add_xaxis(x) # x์ถ
.add_yaxis("์ด์ธ๊ตฌ", y, label_opts = False) # y์ถ1
.add_yaxis("๋จ์ ์ธ๊ตฌ", man, label_opts = False) # y์ถ2
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman, label_opts = False) # y์ถ3
.set_global_opts(title_opts = opts.TitleOpts(title = "2020๋
๋ํ๋ฏผ๊ตญ ์ฑ๋ณ ์ธ๊ตฌ",
subtitle = "์ธ๊ตฌ์ด์กฐ์ฌ ์ ์๋ถ๋ฌธ"))
.render_notebook()
)
triple_bar
์ด๋ฒ์๋ ๋ฉ์๊ฒ ๋ง๋๊ทธ๋ํ์ ์ ๊ทธ๋ํ๋ฅผ ๊ฐ์ด ๊ทธ๋ ค๋ณด์
# data์ ์๋ก์ด ์ปฌ๋ผ ์ถ๊ฐ - ์ฑ๋ณ ์ฐจ์ด
data["์ฑ๋ณ ์ธ๊ตฌ ์ฐจ์ด"] = data["๋จ์ (๋ช
)"] - data["์ฌ์ (๋ช
)"]
man_subtract_woman = list(data["์ฑ๋ณ ์ธ๊ตฌ ์ฐจ์ด"])
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("๋จ์ ์ธ๊ตฌ", man)
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman)
.extend_axis(
yaxis = opts.AxisOpts(
axislabel_opts = opts.LabelOpts(formatter="{value} ยฐ"), interval=5 # ์ด๊ฑด ๋ชจ๋ฅด๊ฒ ๋ค.
)
)
.set_series_opts(label_opts = opts.LabelOpts(is_show = False)) # ๋ง๋๊ทธ๋ํ ๊ฐ ํ์ off
.set_global_opts(
title_opts = opts.TitleOpts(title="๋ง๋๊ทธ๋ํ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ"),
yaxis_opts = opts.AxisOpts(axislabel_opts = opts.LabelOpts(formatter="{value} ๋ช
")), # y์ถ ๊ฐ์ '๋ช
' ์ถ๊ฐ
)
)
line = Line().add_xaxis(x).add_yaxis("์ฑ๋ณ ์ธ๊ตฌ ์ฐจ์ด", man_subtract_woman, yaxis_index=1)
bar.overlap(line)
bar.render_notebook()
์์์ ๊ทธ๋ํ ์ค/์์์ ์ด๋ฒ์๋ ์ธ๋ก ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("๋จ์ ์ธ๊ตฌ", man)
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman)
.extend_axis(
yaxis = opts.AxisOpts(
axislabel_opts = opts.LabelOpts(formatter="{value} ยฐ"), interval=5 # ์ด๊ฑด ๋ชจ๋ฅด๊ฒ ๋ค.
)
)
.set_series_opts(label_opts = opts.LabelOpts(is_show = False)) # ๋ง๋๊ทธ๋ํ ๊ฐ ํ์ off
.set_global_opts(
title_opts = opts.TitleOpts(title="๋ง๋๊ทธ๋ํ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ"),
yaxis_opts = opts.AxisOpts(axislabel_opts = opts.LabelOpts(formatter="{value} ๋ช
")), # y์ถ ๊ฐ์ '๋ช
' ์ถ๊ฐ
datazoom_opts=opts.DataZoomOpts(orient="vertical") # ์ธ๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค/์์ ํ ์ ์๋ค.
)
)
line = Line().add_xaxis(x).add_yaxis("์ฑ๋ณ ์ธ๊ตฌ ์ฐจ์ด", man_subtract_woman, yaxis_index=1)
bar.overlap(line)
bar.render_notebook()
์์์ ๊ทธ๋ํ์ ๋งํฌํฌ์ธํธ๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ด๋ฒ์๋ ๋งํฌ๋ผ์ธ์ ์ถ๊ฐํด๋ณด์.
bar = (
Bar()
.add_xaxis(x)
.add_yaxis("๋จ์ ์ธ๊ตฌ", man)
.add_yaxis("์ฌ์ ์ธ๊ตฌ", woman)
.extend_axis(
yaxis = opts.AxisOpts(
axislabel_opts = opts.LabelOpts(formatter="{value} ยฐ"), interval=5 # ์ด๊ฑด ๋ชจ๋ฅด๊ฒ ๋ค.
)
)
.set_series_opts(label_opts = opts.LabelOpts(is_show = False),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(y=12500000, name="yAxis=๋๋ต ์ ๋ฐ")])) # ๊ธฐ์ค์ ์ถ๊ฐ
.set_global_opts(
title_opts = opts.TitleOpts(title="๋ง๋๊ทธ๋ํ์ ์ ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ"),
yaxis_opts = opts.AxisOpts(axislabel_opts = opts.LabelOpts(formatter="{value} ๋ช
")), # y์ถ ๊ฐ์ '๋ช
' ์ถ๊ฐ
)
)
line = Line().add_xaxis(x).add_yaxis("์ฑ๋ณ ์ธ๊ตฌ ์ฐจ์ด", man_subtract_woman, yaxis_index=1)
bar.overlap(line)
bar.render_notebook()
์ด๊ฑด ๋๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
from pyecharts.commons.utils import JsCode
cool_bar = (
Bar()
.add_xaxis(x)
.add_yaxis("์ด์ธ๊ตฌ", y, category_gap="20%", label_opts = False) # category_gap์ ๋ง๋์ ๋๊ป๋ก ๋์์๋ก ์์์ง๋ค.
.set_series_opts(
itemstyle_opts={
"normal": {
"color": JsCode(
"""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgba(0, 244, 255, 1)'
}, {
offset: 1,
color: 'rgba(0, 77, 167, 1)'
}], false)"""
),
"barBorderRadius": [10, 10, 0, 0], # ๋ง๋๊ทธ๋ํ์ ๋ฅ๊ทผ ์ ๋ ์ค์
"shadowColor": "rgb(0, 160, 221)",
}
}
)
.set_global_opts(title_opts=opts.TitleOpts(title="2020๋
๋ํ๋ฏผ๊ตญ ์ด์ธ๊ตฌ"))
.render_notebook()
)
cool_bar