데이터를 프레젠테이션할 때 차트가 움직이면 몰입도와 재미가 높아집니다. 회사에서 보고 목적으로 사용하기는 어렵지만, 고객 서비스 등에서 사례를 찾아볼 수 있습니다. 그중 유명한 gapminder의 버블 차트를 파이썬 matplotlib을 이용해서 그려보았습니다.
한 때 한스 로슬링 교수의 gapminder(갭 마인더)가 많이 회자되었습니다. 우리나라에도 인구총조사 때 통계청에서 초대하여 강의를 하신 적도 있지요. 필자도 우연히 기회가 닿아 가서 강의를 보았습니다. 데이터를 시각화해서 스포츠 중계를 하듯이 역동적으로 보여주는 모습은 지루한 데이터 내용을 쉽고 재미있게 접할 수 있게 해 줍니다.
gapminder는 데이터 시각화를 위한 멋진 툴이지만, 데이터를 공개해야 하고 정해지 레이아웃 외에 동적인 차트를 그리기는 어렵습니다. 하지만 가끔 입맛대로 그리고 싶은 것이 사람의 욕구가 아닐까 합니다. 그래서 파이썬으로 간단하게 구현해 보았습니다.
파이썬으로 데이터 시각화를 구현하는 것은 여러가지 패키지들을 이용할 수 있어 편리하고 자유도가 높은 편입니다. 다만 타블로나 프로세싱 등에 비해서는 덜 이쁜(?) 것이 단점입니다. 하지만 그렇다고 굉장히 이쁘지 않은 것은 또 아닙니다.
파이썬으로 움직이는 버블 차트를 그리기 위해서는 2가지가 필요합니다.
1. 차트를 삭제합니다
어렸을 때 책 구석에 페이지마다 그림을 연속으로 그리면 움직이는 영상을 만들 수 있었습니다. 그와 같이 움직이는 것처럼 보이게 하기 위해 앞에 그린 차트를 삭제하고, 다른 위치에 다음 차트를 그리면 움직이는 것처럼 보입니다.
차트를 삭제하는 것은 어렵지 않습니다. 차트를 그릴 때 변수를 지정하고, 이후에 remove() 함수를 호출하면 그린 차트를 없앨 수 있습니다.
# coding=utf-8
import matplotlib.pyplot as plt
graph=plt.scatter(10,10,10)
graph.remove()
예를 들어 위와 같이 graph라는 변수를 지정해서 차트를 그리고 삭제하면 됩니다.
2. 시간을 멈춥니다
위와 같이 차트를 삭제하고 다시 그리는 것으로 코딩을 해도 실행시키면 엄청난 컴퓨터 속도(?) 때문에 최종 모습의 차트만 보이게 됩니다. 그래서 다시 그리기 전에 사람이 인식할 수 있는 수준 정도 멈춰져야 합니다. 처음에는 time 라이브러리를 활용했는데 잘 작동하지 않습니다.
더 찾아보니 pause()함수를 이용해서 정지할 수 있었습니다. matplotlib.pyplot에 속해 있는 함수로 괄호 안에 숫자를 넣어주면 일정 시간 동안 정지됨을 알 수 있습니다.
# coding=utf-8
import matplotlib.pyplot as plt
graph=plt.scatter(10,10,10)
plt.pause(1)
graph.remove()
앞의 예제 중간에 위와 같이 pause를 넣어주면 일정 시간 이후에 차트가 삭제되는 것을 알 수 있습니다.
위의 2가지가 있으면 이제 움직이는 차트를 그릴 수 있습니다. 데이터는 일단 랜덤 하게 만들어서 차트를 그려보았습니다. 완성된 차트의 모습은 아래와 같습니다.
디자인이 아름답지는 않지만 기본 골격은 다 갖춘 것 같습니다. 필요에 따라 요소들을 추가하면 되겠습니다. 파이썬 코드는 아래와 같습니다.
# coding=utf-8
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 데이터 생성
x = np.arange(1,20)
y = np.arange(1,20)
z = np.arange(101,120)
x1=pd.DataFrame(x,columns={"x"})
y1=pd.DataFrame(y,columns={"y"})
z1=pd.DataFrame(z,columns={"z"})
temp_data1=pd.concat([x1,y1,z1],1)
temp_data1["cla"]="서울"
x = np.arange(1,20)
y = np.arange(11,30)
z = np.random.rand(19)*1000
x1=pd.DataFrame(x,columns={"x"})
y1=pd.DataFrame(y,columns={"y"})
z1=pd.DataFrame(z,columns={"z"})
temp_data2=pd.concat([x1,y1,z1],1)
temp_data2["cla"]="인천"
data=pd.concat([temp_data1,temp_data2],0)
# make a cla list
group_list=list(data["cla"].drop_duplicates())
fig=plt.figure()
# x축 y축 폭 결정
plt.xlim(data["x"].min(),data["x"].max())
plt.ylim(data["y"].min(),data["y"].max())
plt.ion()
# 색깔 정하기
color=list(["r","b","y","o","g","v"])
color_list=color[0:len(group_list)]
x_list=list(data["x"].drop_duplicates())
plt.pause(10)
for i in x_list:
graph_list = list()
for j in group_list:
index=group_list.index(j)
temp_data = data[data["x"] == i]
temp_data=temp_data[temp_data["cla"]==j]
graph=plt.scatter(temp_data["x"],temp_data["y"],s=temp_data["z"],c=color_list[index])
graph_list.append(graph)
plt.pause(0.1)
if i==max(x_list):
break
else:
for j in range(0,len(group_list)):
graph_list[j].remove()
사실 지금은 좋은 데이터 시각화 패키지가 많이 나와서 굳이 이렇게 할 필요는 없습니다. plotly를 이용하면 쉽게 움직이는 차트를 그릴 수 있습니다. 필자의 도서에서도 이를 활용하여 연도에 따라 움직이는 인구통계 차트를 만들어 보았습니다.
오늘은 이렇게 파이썬으로 움직이는 버블 차트 그리기에 대해서 알아보았습니다. 다음에는 임의로 만든 데이터가 아닌 실제 데이터를 활용해서 움직이는 버블 차트를 그려보겠습니다.
'데이터 > 데이터 분석' 카테고리의 다른 글
파이썬 seaborn 그래프 그리기-막대그래프,캣플랏,히트맵,페어플랏 등 (0) | 2022.01.25 |
---|---|
파이썬 데이터 시각화 분석 패키지 BEST5! (0) | 2022.01.25 |
파이썬 회귀분석 하는 방법 알아보기 (0) | 2022.01.23 |
파이썬 seaborn 그래프 그리기-박스플랏, 히스토그램, 카운트플랏, 산점도, 라인그래프 (0) | 2022.01.22 |
파이썬 회귀선 seaborn 패키지로 쉽게 그리는 방법은?! (0) | 2022.01.21 |
matplotlib 설치 및 사용법 알아보기 (0) | 2022.01.20 |
파이썬 판다스 Series 자료형 내용과 사용법 알아보기! (0) | 2022.01.20 |
미래인구수 데이터 수집 및 시각화하는 방법은?! (0) | 2022.01.19 |