데이터를 프레젠테이션할 때 차트가 움직이면 몰입도와 재미가 높아집니다. 회사에서 보고 목적으로 사용하기는 어렵지만, 고객 서비스 등에서 사례를 찾아볼 수 있습니다. 그중 유명한 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를 이용하면 쉽게 움직이는 차트를 그릴 수 있습니다. 필자의 도서에서도 이를 활용하여 연도에 따라 움직이는 인구통계 차트를 만들어 보았습니다.


오늘은 이렇게 파이썬으로 움직이는 버블 차트 그리기에 대해서 알아보았습니다. 다음에는 임의로 만든 데이터가 아닌 실제 데이터를 활용해서 움직이는 버블 차트를 그려보겠습니다.

 

파이썬 애니메이션 차트 쉽게 만드는 방법은?!

파이썬에서 움직이는 차트를 만드는 방법은 여러가지가 있습니다. matplotlib패키지에서 시간 간격을 두고 차트를 새로 그리면 차트가 움직이는 것처럼 보입니다. 하지만 이것보다 

aplab.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기