您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖”,在日常操作中,相信很多人在Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
有小伙伴說,使用 matplotlib 做出來(lái)的圖表比不上其他的基于 js 包裝的庫(kù)(pyechart、bokeh、plotly等)漂亮,他們可以還可以交互。同時(shí),基于 matplotlib 包裝的 seaborn 似乎也比較省代碼。
本想寫一篇文章整體說一下這些庫(kù)的對(duì)比,但是如果沒有實(shí)際例子不太符合我的風(fēng)格。
因此,今天的目標(biāo)圖表是其他上層可視化庫(kù)難以做到(或者根本無(wú)法完成):
此圖表是模仿《經(jīng)濟(jì)學(xué)人》,是關(guān)于加拿大移民與出生地相關(guān)的圖表
那些基于 js 包裝的可視化庫(kù),在js環(huán)境下,按理應(yīng)該是可以做到。但在 Python 中就不會(huì)這么樂觀
有機(jī)會(huì)我會(huì)分享 d3.js 的做法,你會(huì)發(fā)現(xiàn)他與 matplotlib 的思路很相似
本文所需要的庫(kù)如下:
行8:cycler 包只是為了方便定義顏色板
數(shù)據(jù)是這樣子:
行3:泡泡圖的數(shù)據(jù)列
行4:堆積圖的數(shù)據(jù)列
本文所有的通用函數(shù)以寬表作為依據(jù),行索引放 X 軸,每一列作為不同的圖表系列
這是顏色的定義:
m_color_cycle 定義了7個(gè)系列的顏色,顏色值提取自示例圖表
m_bubble_color 是泡泡圖的顏色
篇幅有限,我不會(huì)對(duì)所有的知識(shí)點(diǎn)都作詳細(xì)講解
通常復(fù)雜的可視化是通過多種類型的圖形組合而成,顯然這次的目標(biāo)圖表是由3個(gè)部分組成:
堆積圖,實(shí)際就是四邊形圖形而已
泡泡圖,實(shí)際就是圓圈圖形
中間作為連接修飾的長(zhǎng)方形
為什么我用"圖形"去描述他們?
如果你使用一些上層的可視化庫(kù),你會(huì)發(fā)現(xiàn)他們會(huì)在圖表類型層面歸類,這無(wú)疑讓你能快速作圖。但缺點(diǎn)就是無(wú)法隨心所欲定制化圖表。
而 matplotlib 提供了底層"圖形"的控制,同時(shí)也提供了基本圖表操作。
首先看看如何做出堆積圖,下面以2個(gè)系列作為示例:
行7:使用 Axes.bar 方法可以畫出柱狀圖,其中 bottom 參數(shù)決定了每個(gè)柱子的起始位置,默認(rèn)情況下全是0
行11:當(dāng)畫第二個(gè)系列時(shí),只要把第一個(gè)系列的 y 值設(shè)置為 第二系列 的 起始點(diǎn),自然而然就做出了堆積圖的效果
圖表如下:
知道這個(gè)原理,那么就可以定義通用的函數(shù):
本文所有的通用函數(shù)都基于寬表數(shù)據(jù)
行3:通過累計(jì)求和+偏移操作,求出每個(gè)系列的 bottom 值
行5:直接從 DataFrame 中遍歷取出每一列,分別畫柱子。m_color_cycle 是之前定義好的顏色板
行3是基本的 pandas 操作,有興趣可以參考我的 pandas 專欄
調(diào)用如下:
行3:原數(shù)據(jù)有多余的列,要選出需要的列,然后按第一年的值,橫向排序一下
圖表如下:
基本的圖表做出來(lái),最后再調(diào)整一些細(xì)節(jié)(比如y軸的位置,刻度線等等),因?yàn)檫@些只是一些操作,非常簡(jiǎn)單。
接下來(lái)做泡泡圖
數(shù)據(jù)可視化的本質(zhì),實(shí)際是數(shù)據(jù)到圖形元素的映射。
看看之前的堆積圖,我們成功把數(shù)據(jù)中的3種維度數(shù)據(jù)映射上去:
年份,映射到柱子的水平位置(x軸位置)
數(shù)值,映射到柱子的高度(調(diào)用 bar 方法時(shí)的參數(shù) height)
地區(qū),映射到柱子的顏色
看一個(gè)極端的例子。數(shù)據(jù)中還有一列移民人數(shù)(migrant),我們?nèi)匀豢梢酝逊e圖上映射:
雖然現(xiàn)在圖表看起來(lái)非常奇怪,但的確是可行:
每一年的柱子寬度與數(shù)據(jù) migrant 關(guān)聯(lián)起來(lái),柱子越寬,表示那一年移民人數(shù)越多
現(xiàn)在,你應(yīng)該感受到數(shù)據(jù)可視化的本質(zhì),同時(shí)也看到,每一種的圖表可以合理映射的維度是有限的。
比如上面的堆積圖的柱子寬度顯然不是一個(gè)合理映射屬性。
解決方法就是用其他的"圖形"繼續(xù)做映射。
我們?cè)谕粋€(gè)坐標(biāo)系上畫散點(diǎn)圖,映射關(guān)系如下:
圓點(diǎn)的水平位置映射為年份
圓點(diǎn)的垂直位置映射為固定值(只要在柱子的下方就可以)
圓點(diǎn)的半徑映射為數(shù)據(jù) migrant
代碼如下:
本文所有通用函數(shù)基于 DataFrame 固定列名。比如數(shù)據(jù)中需要有名為 size 的列,此列作為泡泡的大小。
行6:Axes.scatter 即可畫出圓點(diǎn),參數(shù) s 就是圓點(diǎn)的半徑
參數(shù) clip_on 設(shè)置為 False,可以防止圓點(diǎn)太大超出了可視區(qū)被裁剪
調(diào)用如下:
行6:把列名修改合適
行7:參數(shù)y,決定泡泡的位置。注意這里的 -25 是對(duì)應(yīng)圖表上y軸的數(shù)值
看看圖表:
下一步,加上中間連接修飾的矩形框
matplotlib 內(nèi)置了許多基本圖形,因此創(chuàng)建圖形不是什么難事:
這是在
行9:創(chuàng)建一個(gè)矩形,第一個(gè)參數(shù)是系列,表示 x、y 的位置。
行10:往坐標(biāo)系中加入這個(gè)圖形
注意,上面行9中設(shè)置的參數(shù)的數(shù)值,默認(rèn)是按數(shù)據(jù)表示。
比如,[0,40] 的40,相當(dāng)于指定矩形的左下角點(diǎn)位于 y 軸值為 40 的位置
但是,[0,40] 的 0 應(yīng)該表示的是 x 軸,為什么是0?
這是因?yàn)槲覀冏鲌D時(shí),傳給 x 軸的是字符串:
此時(shí)坐標(biāo)系 x 軸被 matplotlib 轉(zhuǎn)成 0 開始的升序編碼
matplotlib 有6種坐標(biāo)系轉(zhuǎn)換,這是最重要的核心機(jī)制,這里不深入講解
看看效果:
矩形左下角在 第一個(gè)柱子中間,y 軸點(diǎn)40的位置
高度剛好占 y 軸 20個(gè)單位的長(zhǎng)度
寬度剛好是 10 個(gè)柱子寬度總和
知道了原理,那么需求就非常容易了:
看看效果:
非常好,為泡泡圖加上數(shù)據(jù)標(biāo)簽,原理與之前一樣:
最后,按要求調(diào)整軸的細(xì)節(jié)即可:
完整調(diào)用如下:
效果如下:
你會(huì)發(fā)現(xiàn),整個(gè)過程我們一直在設(shè)置數(shù)據(jù)與圖形的關(guān)聯(lián),這就是 matplotlib 的核心思路!
看似需要很多代碼,但是我們非常容易就可以使他們?cè)诓煌臄?shù)據(jù)之間重復(fù)使用。
接下來(lái)我會(huì)繼續(xù)編寫更多非常規(guī)要求的圖表,敬請(qǐng)關(guān)注!
到此,關(guān)于“Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。