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