최근 실습해본 시각화 기법은 Pyechart, Folium, Geocoding이다.
전반적인 패키지 설명이 아닌 내가 필요에 의해 사용했던 코드만 간략히 보여주려한다.
한꺼번에 블로그를 쓰기보단 필요한 부분만 볼 수 있도록 3개의 글로 나눠 적을 것이다.
오늘은 Pyecharts 먼저 소개한다.
그냥 그래프를 그리는 것은 ggplot으로도 가능하고, matplotlib로도 가능하다.
내가 pyecharts를 이용해 그래프를 그린 이유는 때에 따라서 움직이는 그래프를 그리고 싶어서이다.
정적인 그래프도 사실 잘 그리는 편은 아니지만 그려본 적은 꽤 있다. 그런데 3D라던지 동적인 그래프는 잘 안그려봤다.
그래서 이번에 pyecharts를 이용해 막대그래프를 그려보았다.
일단 데이터를 만든다.
import pandas as pd
from pyecharts.charts import Bar, Timeline
from pyecharts.globals import ThemeType
from pyecharts import options as opts
data = pd.DataFrame({"col" : ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
"first" : [1, 4, 5, 3, 9, 10, 2, 3, 6, 1],
"second" : [10, 34, 24, 15, 27, 24, 11, 23, 14, 35],
"third" : [100, 234, 255, 233, 144, 151, 194, 245,198, 175]})
data = data.melt(id_vars = "col", var_name = "order", value_name = "value")
일반적인 데이터프레임을 만든 후 melt 함수를 이용해 Pyecharts를 사용할 수 있는 데이터 형식으로 변경을 해준다.
tl = Timeline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_schema(is_auto_play=True)
for t in data["col"].unique():
tl.add((Bar(init_opts = opts.InitOpts(theme = ThemeType.WHITE))
.add_xaxis(data["order"].unique().tolist())
.add_yaxis('value', data[data["col"] == t]["value"].tolist(), color = "blue")
.set_global_opts(title_opts=opts.TitleOpts(title="Example", subtitle = "{}".format(t)),
yaxis_opts=opts.AxisOpts(max_=260))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))),"{}".format(t))
tl.render_notebook()
Timeline은 시간의 흐름에 따른 그래프의 변화를 보기위해 사용한 함수이다. WHITE는 여러가지 TYPE을 사용해봤을 때, 그래프의 배경인 것 같다. is_auto_play는 자동으로 실행을 할 것인지 물어보는 것이다.
막대그래프를 그리기 위해 Bar 함수를 사용했다. 밑에 올려둔 pyecharts 문서를 보면 Bar 뿐만아니라 다른 그래프들도 그릴 수 있다.
x축과 y축을 지정해주고, color은 blue로 하였다. 이것도 여러가지로 바꾸면 된다. title도 지정해주고, subtitle도 지정해줄 수 있다. max_ 옵션을 통해서 최댓값을 지정해줄수도 있다.
is_show는 막대그래프에 value를 표시해줄 것인지 아닌지이다. 그리고 add 함수 마지막에 "{}".format(t)를 해주지 않으면 error가 생긴다.
render_notebook()은 주피터노트북에 그래프를 그린다는 뜻이다. 그래프를 저장하고 싶다면 tl.render("주소.html")을 하면된다.
html로 저장된 파일의 그래프를 tistory에 올리는 법을 몰라서 그냥 캡처 이미지만 올렸다.
시간축과 x축을 바꿀 수도 있다.
tl = Timeline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_schema(is_auto_play=True)
for t in data["order"].unique():
tl.add((Bar(init_opts = opts.InitOpts(theme = ThemeType.WHITE))
.add_xaxis(data["col"].unique().tolist())
.add_yaxis('value', data[data["order"] == t]["value"].tolist(), color = "blue")
.set_global_opts(title_opts=opts.TitleOpts(title="Example", subtitle = "{}".format(t)),
yaxis_opts=opts.AxisOpts(max_=260))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))),"{}".format(t))
tl.render_notebook()
하나의 데이터가 아닌 두개의 데이터가 있는 경우도 보자.
예를들어 월별 버스, 지하철, 자전거 등 대중교통 이용자 수를 남성 데이터, 여성 데이터 혹은 연령별로 나눠뒀다면 각각 보는 것도 중요하지만 같이 그려보는 것도 필요할 때가 있다.
데이터를 하나 추가한다.
data_2 = pd.DataFrame({"col" : ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
"first" : [4, 8, 3, 7, 8, 4, 5, 2, 5, 9],
"second" : [36, 25, 47, 29, 16, 34, 27, 31, 23, 19],
"third" : [144, 233, 251, 152, 167, 165, 135, 163, 198, 157]})
data_2 = data_2.melt(id_vars = "col", var_name = "order", value_name = "value")
tl = Timeline(init_opts=opts.InitOpts(theme=ThemeType.WHITE)).add_schema(is_auto_play=True)
for t in data["order"].unique():
tl.add((Bar(init_opts = opts.InitOpts(theme = ThemeType.WHITE))
.add_xaxis(data["col"].unique().tolist())
.add_yaxis('value_1', data[data["order"] == t]["value"].tolist(), color = "blue", gap = "0%")
.add_yaxis('value_2', data_2[data_2["order"] == t]["value"].tolist(), color = "red", gap = "0%")
.set_global_opts(title_opts=opts.TitleOpts(title="Example", subtitle = "{}".format(t)),
yaxis_opts=opts.AxisOpts(max_=260))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))),"{}".format(t))
tl.render_notebook()
그래프를 그리는데 yaxis를 하나 추가한다. 그리고 이름도 value_1, value_2로 다르게 지정해준다. 똑같이 "value"로 지정해줬더니 색 구분을 하지 않고 하나의 색으로 쭉 그린다.
각각 데이터에서 value를 따로 뽑아 리스트로 넣어주고, 색은 blue랑 red로 설정했다. gap 옵션은 디폴트로 그리면 모든 막대그래프가 일정한 간격으로 떨어져서 그려진다. 그러면 지하철타는 남녀, 버스타는 남녀 각각 구분해서 보고싶은데 보기가 불편하다. 그럴 때 gap을 0%로 지정해 딱 구분되게 지하철이면 지하철, 버스면 버스에 해당하는 데이터들을 붙여서 보여줄 수 있다.
나머지 코드는 동일하다.
pyecharts 코드는 아래 두 글의 코드를 많이 참고해서 작성한 것이다.
실제론 더 여러가지를 해봤는데 위의 코드에서 데이터만 바꾸고, 함수만 pyecharts 문서를 보고 조금 바꾸면 된다.
중국어로 써있어서 코드만 보고 이해하기 힘들었다. 찾으려니 안보여서 링크를 못올리지만 잘 찾아보면 영어로 쓰여진 문서도 있었던 것 같다.
https://dacon.io/competitions/official/235724/codeshare/2737
Pyechart를 활용한 청년층의 '서울 내 집 마련 포기' 현상 분석
월간 데이콘 한국 부동산 데이터 시각화 경진대회
dacon.io
https://pyecharts.org/#/zh-cn/intro
pyecharts - A Python Echarts Plotting Library built with love.
pyecharts.org
'Study > Python' 카테고리의 다른 글
[서울시 기온 예측 해커톤] Neuralprophet (1) | 2024.01.05 |
---|---|
[Python] 시각화 3. Geocoding (1) | 2023.12.18 |
[Python] 시각화 2. Folium (1) | 2023.12.17 |
[Python] PyCharm에서 main.py (1) | 2023.10.22 |