한 때 한스 로슬링 교수의 gapminder(갭마인더)가 많이 회자된 적이 있다. 우리나라에도 인구총조사 때 통계청에서 초대하여 강의를 하신 적도 있다. 필자도 우연히 기회가 닿아 가서 강의를 보았다. 데이터를 시각화해서 스포츠 중계를 하듯이 역동적으로 보여주는 모습은 지루한 데이터 내용을 쉽고 재미있게 접할 수 있게 해 준다.
gapminder는 데이터 시각화를 위한 멋진 툴이지만, 데이터를 공개해야 하고 정해지 레이아웃 외에 동적인 차트를 그리기는 어렵다. 하지만 가끔 입맛대로 그리고 싶은 것이 사람의 욕구가 아닐까.
그래서 오늘은 파이썬 matplotlib을 이용해서 gapminder의 버블 차트를 그려보고자 한다.

 

 

파이썬 움직이는 차트

 

 

파이썬으로 데이터 시각화를 구현하는 것은 여러가지 패키지들을 이용할 수 있어 편리하고 자유도가 높은 편이다 .다만, 타블로나 프로세싱 등에 비해서는 덜 이쁜(?) 것이 단점이다. 하지만 그렇다고 굉장히 이쁘지 않은 것은 또 아니다.

 


파이썬으로 움직이는 버블 차트를 그리기 위해서는 2가지가 필요하다. 

 

하나는 그린 차트를 삭제하는 것이다.

어렸을 때 책 구석에 페이지마다 그림을 연속으로 그리면 움직이는 영상을 만들 수 있었다. 그와 같이 움직이는 것처럼 보이게 하기 위해 앞에 그린 차트를 삭제하고, 다른 위치에 다음 차트를 그리면 움직이는 것처럼 보인다

차트를 삭제하는 것은 어렵지 않다. 차트를 그릴 때 변수를 지정하고, 이후에 remove()함수를 호출하면 그린 차트를 없앨 수 있다.

# coding=utf-8
 
 
import matplotlib.pyplot as plt
 
graph=plt.scatter(10,10,10)
graph.remove()

 

예를 들어 위와 같이 graph라는 변수를 지정해서 차트를 그리고 삭제하면 된다.

 

 

두 번째는 시간을 멈추는 것이다.

위와 같이 차트를 삭제하고 다시 그리는 것으로 코딩을 해도 실행시키면 엄청난 컴퓨터 속도(?) 때문에 최종 모습의 차트만 보이게 된다. 그래서 다시 그리기 전에 사람이 인식할 수 있는 수준 정도 멈춰져야 한다. 처음에는 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를 이용하면 쉽게 움직이는 차트를 그릴 수 있다. 필자의 도서에서도 이를 활용하여 년도에 따라 움직이는 인구통계 차트를 만들었다.

 


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

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

댓글을 달아 주세요

">