도도부현별 인구동태를 가시화해 보았다 - Matplotlib에서 Bubble 플롯

소개



matplotlib에서 bubble 플롯을하는 기사가 qiita에서 발견되지 않았기 때문에 시도했습니다.
샘플 데이터로 인구 조사 남녀별 인구-전국, 도도부현(다이쇼 9년~2015년)를 사용하고 있습니다.

버블 플롯



먼저 결과를 보여주면 버블 플롯은 이런 느낌의 플롯입니다. 1개 1개의 엔이 도도부현, 엔의 크기가 인구의 수를 나타내고 있습니다. 좌표의 위치는 무작위입니다.



데이터 정형



이번은 보통 pandas.read_csv로 읽어들여 조건으로 필터를 걸어 주면 됩니다. 주의해야 할 점으로서는 원 데이터의 인코딩이 Shift-JIS인 것과, Series에 대해서 있는 캐릭터 라인을 1개라도 포함하는 조건을 쓰고 있는 곳입니까. 덧붙여서 플롯하는 도도부현은, 이와테, 도쿄, 아이치, 고치, 후쿠오카, 가고시마를 선택했습니다. 전혀 의미가 없습니다.
data = pd.read_csv("./c01.csv", encoding="Shift-JIS", skipfooter=2)
target_pref = ["岩手県", "東京都", "愛知県", "高知県", "福岡県", "鹿児島県"]
data_target = data[data.都道府県名.str.contains("|".join(target_pref))]
d = data_target[data_target['西暦(年)'] == 1920]




도도부현 코드
도도부현명
원호
화력(년)
서기(년)
참고
인구(총수)
인구(남)
인구(여)




3
03
이와테현
다이쇼
9
1920년
NaN
845540
421069
424471


13
13
도쿄도
다이쇼
9
1920년
NaN
3699428
1952989
1746439


23
23
아이치현
다이쇼
9
1920년
NaN
2089762
1033860
1055902


39
39
고치현
다이쇼
9
1920년
NaN
670895
332087
338808


40
40
후쿠오카현
다이쇼
9
1920년
NaN
2188249
1116818
1071431


46
46
가고시마현
다이쇼
9
1920년
NaN
1415582
682243
733339



버블 플롯 그리기



matplotlib에서 버블 플롯을 그리는 경우 산점도를 그리는 함수 plt.scatter에서 점의 크기를 개별적으로 변경하여 대응합니다. 이번 해석에서는 x, y를 랜덤하게 생성한 후, 원의 ​​크기 z, 색 c를 개별적으로 지정하고 있습니다. 이제 시작 부분의 그래프를 만들 수 있습니다.
c = np.arange(0,12,2)
z = d['人口(総数)'].astype(int) / 1000
x = np.random.rand(6)
y = np.random.rand(6)
plt.scatter(x, y, s = z, alpha=0.5, c=c)
for i, t in enumerate(target_pref):
    plt.text(x[i]-0.025,y[i], t, fontsize=15)



모처럼이므로 연도마다 플롯하고 애니메이션도 붙여 보았습니다. 도쿄·아이치·후쿠오카는 인구가 늘어나고 있는 것에 대해, 이와테, 고치, 가고시마는 거의 변화하고 있지 않습니다. 1945년에 도쿄의 인구가 꽉 찢어지는 근처 등은, 제2차 세계 대전의 영향의 크기를 시사하고 있습니다.



아래에 코드를 올립니다. 애니메이션은 일단 모두 png로 출력한 후 convert로 gif로 변환하여 생성하고 있습니다.

bubble_anim.gif
for year in range(1920, 2016, 5):
    z = data_target[data_target["西暦(年)"] == year]['人口(総数)'].astype(int) / 1000
    plt.figure()
    plt.scatter(x, y, s = z, alpha=0.5, c=c)
    for i, t in enumerate(target_pref):
        plt.text(x[i]-0.025,y[i], t, fontsize=15)
    plt.xlim((-0.2,1.2))
    plt.ylim((-0.2,1.2))
    plt.title("{0}年".format(year))
    plt.axis('off')
    plt.savefig("./bubble/{0}.png".format(year))

좋은 웹페이지 즐겨찾기