利用动态气泡图进行数据分析
? ???作者:林驥
? ? ?來(lái)源:林驥
01
你好,我是林驥。
一個(gè)動(dòng)態(tài)氣泡圖,可以展現(xiàn)多個(gè)維度的信息。
比如說(shuō),要對(duì)比分析中國(guó)和美國(guó)從 1800 年以來(lái)每年的人口數(shù)量、人均收入和預(yù)期壽命,我們可以這樣設(shè)置每個(gè)維度代表的含義:
(1)X 軸:人均收入;
(2)Y 軸:預(yù)期壽命;
(3)氣泡大小:人口;
(4)氣泡顏色:國(guó)家;
(5)時(shí)間變化:年份。
利用 matplotlib 制作動(dòng)畫的功能,我做了一個(gè)動(dòng)態(tài)氣泡圖的視頻:
在作圖的細(xì)節(jié)方面,我做了一下刻意的調(diào)整:
(1)圖表標(biāo)題文字用深灰色,并且左對(duì)齊;
(2)X 軸和 Y 軸的標(biāo)題與數(shù)字對(duì)齊,豎向的文字分行逐字顯示;
(3)氣泡的顏色與對(duì)應(yīng)的文字使用接近的顏色;
(4)去掉網(wǎng)格線、圖例、邊框、刻度線等元素;
(5)只選取兩個(gè)國(guó)家的數(shù)據(jù)。
以上這些刻意的調(diào)整,主要是為了更加突出地展現(xiàn)數(shù)據(jù)本身,或許讓人看起來(lái)比較「素顏」,但是不要忘了我們作圖的目標(biāo),是讓觀眾更加快速地理解想要表達(dá)的信息,而不是靠「濃妝艷抹」去吸人眼球。
數(shù)據(jù)可視化,有時(shí)需要有批判性思維,突出數(shù)據(jù)中的重要內(nèi)容。我們可以從設(shè)計(jì)師身上學(xué)習(xí),多想一想數(shù)據(jù)可視化的目標(biāo)是什么,盡可能讓數(shù)據(jù)更利于觀眾理解,而不能拿著數(shù)字,就開始盲目地畫圖。
02
接下來(lái),我們看看用 matplotlib 畫圖的具體步驟。
首先,導(dǎo)入所需的庫(kù),并設(shè)置中文字體和定義顏色等。
# 導(dǎo)入所需的庫(kù) import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation# 正常顯示中文標(biāo)簽 mpl.rcParams['font.sans-serif'] = ['SimHei']# 自動(dòng)適應(yīng)布局 mpl.rcParams.update({'figure.autolayout': True})# 正常顯示負(fù)號(hào) mpl.rcParams['axes.unicode_minus'] = False# 禁用科學(xué)計(jì)數(shù)法 pd.set_option('display.float_format', lambda x: '%.2f' % x)# 定義顏色,主色:藍(lán)色,輔助色:灰色,互補(bǔ)色:橙色 colors = {'藍(lán)色':'#00589F', '深藍(lán)色':'#003867', '淺藍(lán)色':'#5D9BCF','灰色':'#999999', '深灰色':'#666666', '淺灰色':'#CCCCCC','橙色':'#F68F00', '深橙色':'#A05D00', '淺橙色':'#FBC171'}其次,從 Excel 文件中讀取數(shù)據(jù),并定義畫圖用的數(shù)據(jù)。
# 讀取從 https://www.gapminder.org/data 下載的 Excel文件 dfx = pd.read_excel('./data/income_per_person.xlsx', index_col='country') dfy = pd.read_excel('./data/life_expectancy_years.xlsx', index_col='country') dfs = pd.read_excel('./data/population_total.xlsx', index_col='country')接下來(lái),開始用「面向?qū)ο蟆沟姆椒ㄟM(jìn)行畫圖。
# 使用「面向?qū)ο蟆沟姆椒ó媹D,定義圖片的大小 fig, ax = plt.subplots(figsize=(9, 6))# 設(shè)置邊框顏色 ax.spines['top'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) ax.spines['right'].set_visible(False)# 隱藏刻度線 ax.tick_params(axis='x', which='major', length=0) ax.tick_params(axis='y', which='major', length=0)# 設(shè)置坐標(biāo)標(biāo)簽字體大小和顏色 ax.tick_params(labelsize=16, colors=colors['深灰色'])# 動(dòng)畫函數(shù) def animate(year):# 先清空畫布,讓畫面動(dòng)態(tài)顯示新的數(shù)據(jù)ax.cla()# 設(shè)置標(biāo)題ax.text(-11000, 106, '\n中美人口數(shù)量、人均收入和預(yù)期壽命的動(dòng)態(tài)變化\n', fontsize=26, color=colors['深灰色'])# 主要通過(guò)數(shù)字 year 來(lái)控制圖形的變化,year = 0 代表第 1 年,當(dāng) year 增加,相應(yīng)的畫圖數(shù)據(jù)發(fā)生變化# 中國(guó)數(shù)據(jù)x = dfx.loc['China'].iloc[year, ]y = dfy.loc['China'].iloc[year, ]s = dfs.loc['China'].iloc[year, ]/100000000# 畫氣泡圖ax.scatter(x, y, s*500, c = colors['淺藍(lán)色'], alpha=0.9)# 設(shè)置顯示的文本標(biāo)簽ax.text(x, y-18.5, '中國(guó) ' + '%.2f' % s + ' 億人\n$' + '%.0f' % x + ',' + '%.1f' % y + ' 歲', fontsize=16, c = colors['深藍(lán)色'], ha='center', va='center')# 美國(guó)數(shù)據(jù)x = dfx.loc['United States'].iloc[year, ]y = dfy.loc['United States'].iloc[year, ]s = dfs.loc['United States'].iloc[year, ]/100000000# 畫氣泡圖ax.scatter(x, y, s*500, c = colors['淺橙色'], alpha=0.9)# 設(shè)置顯示的文本標(biāo)簽ax.text(x, y+15.5, '美國(guó) ' + '%.2f' % s + ' 億人\n$' + '%.0f' % x + ',' + '%.1f' % y + ' 歲', fontsize=16, c = colors['深橙色'], ha='center', va='top')# 設(shè)置坐標(biāo)軸范圍ax.set_xlim(-5000, 65000)ax.set_ylim(0, 100)# 設(shè)置 X、Y 軸的標(biāo)題,適當(dāng)留白ax.text(-1000, -15, '人均收入$', ha='left', fontsize=16, color=colors['深灰色'])ax.text(-11000, 103, '預(yù)\n期\n壽\n命', va='top', fontsize=16, color=colors['深灰色'])# 更新文本的位置和內(nèi)容x_mean = (ax.get_xlim()[0] + ax.get_xlim()[1]) / 2y_mean = (ax.get_ylim()[0] + ax.get_ylim()[1]) / 2ax.text(x_mean, y_mean, str(1800 + year), ha='center', va='center', fontsize=260, color=colors['灰色'], zorder=-1, alpha=0.2)# 用函數(shù)的方式繪制動(dòng)畫,frames 表示動(dòng)畫的張數(shù), interval 表示間隔毫秒數(shù) anim = FuncAnimation(fig, animate, frames=220, interval=100)# 保存為 mp4 的文件格式 anim.save('動(dòng)態(tài)氣泡圖.mp4')你可以前往 https://github.com/linjiwx/mp 下載畫圖用的數(shù)據(jù)和完整代碼。
03
下面對(duì)這個(gè)動(dòng)態(tài)氣泡圖做一個(gè)簡(jiǎn)單的數(shù)據(jù)分析。
兩個(gè)氣泡的位置在不斷變化,整體趨勢(shì)都是從左下角向右上角移動(dòng),左下角代表貧窮和疾病,右上角代表富有和健康,說(shuō)明兩個(gè)國(guó)家的人們變得越來(lái)越富有、越來(lái)越長(zhǎng)壽;氣泡的大小也在不斷變化,整體趨勢(shì)是越變?cè)酱?#xff0c;代表人口越來(lái)越多。
在這個(gè)動(dòng)態(tài)氣泡圖中,有短暫向下的波動(dòng),如果我們追溯當(dāng)年發(fā)生的事件,那么就會(huì)發(fā)現(xiàn),戰(zhàn)爭(zhēng)等重大災(zāi)難對(duì)人們的預(yù)期壽命影響非常大。
從上面的分析可以看出,真正有意思的,并不是數(shù)據(jù)本身,而是數(shù)據(jù)背后隱藏的信息。
人們都希望知道數(shù)據(jù)有什么意義,如果你能幫助他們,讓他們更容易理解數(shù)據(jù)的意義,那么你就為他們創(chuàng)造了價(jià)值。
要想更容易理解數(shù)據(jù),可視化是一種非常有效的方法,把數(shù)據(jù)放在視覺(jué)空間中,我們的大腦就會(huì)更容易發(fā)現(xiàn)數(shù)據(jù)背后潛藏的信息。
對(duì)數(shù)據(jù)進(jìn)行可視化,我們也要有「雙贏思維」,讓觀眾的興趣與自己想要傳遞的信息保持一致,實(shí)現(xiàn)雙贏。
如果只顧觀眾的興趣,弄了一堆花哨的東西,但是沒(méi)有傳遞有價(jià)值的信息,那么只是浪費(fèi)觀眾和自己的時(shí)間和精力。
如果不顧觀眾的興趣,則做出的圖表可能沒(méi)人看,就容易碌碌無(wú)為,最終也體現(xiàn)不出自己的價(jià)值
◆?◆?◆ ?◆?◆
長(zhǎng)按二維碼關(guān)注我們
數(shù)據(jù)森麟公眾號(hào)的交流群已經(jīng)建立,許多小伙伴已經(jīng)加入其中,感謝大家的支持。大家可以在群里交流關(guān)于數(shù)據(jù)分析&數(shù)據(jù)挖掘的相關(guān)內(nèi)容,還沒(méi)有加入的小伙伴可以掃描下方管理員二維碼,進(jìn)群前一定要關(guān)注公眾號(hào)奧,關(guān)注后讓管理員幫忙拉進(jìn)群,期待大家的加入。
管理員二維碼:
猜你喜歡
●?笑死人不償命的知乎沙雕問(wèn)題排行榜
●?用Python扒出B站那些“驚為天人”的阿婆主!
●?全球股市跳水大戰(zhàn),誰(shuí)最坑爹!
●?華農(nóng)兄弟、徐大Sao&李子柒?誰(shuí)才是B站美食區(qū)的最強(qiáng)王者?
●?你相信逛B站也能學(xué)編程
總結(jié)
以上是生活随笔為你收集整理的利用动态气泡图进行数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为何 navigator.appName
- 下一篇: 《芳华影评》