溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖

發(fā)布時(shí)間:2021-07-23 09:46:19 來(lái)源:億速云 閱讀:346 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“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ú)法完成):

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 此圖表是模仿《經(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ù)如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 行8:cycler 包只是為了方便定義顏色板

數(shù)據(jù)是這樣子:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 行3:泡泡圖的數(shù)據(jù)列

  • 行4:堆積圖的數(shù)據(jù)列

本文所有的通用函數(shù)以寬表作為依據(jù),行索引放 X 軸,每一列作為不同的圖表系列

這是顏色的定義:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • m_color_cycle 定義了7個(gè)系列的顏色,顏色值提取自示例圖表

  • m_bubble_color 是泡泡圖的顏色

篇幅有限,我不會(huì)對(duì)所有的知識(shí)點(diǎn)都作詳細(xì)講解


 

逐一擊破

通常復(fù)雜的可視化是通過多種類型的圖形組合而成,顯然這次的目標(biāo)圖表是由3個(gè)部分組成:

  1. 堆積圖,實(shí)際就是四邊形圖形而已

  2. 泡泡圖,實(shí)際就是圓圈圖形

  3. 中間作為連接修飾的長(zhǎng)方形

為什么我用"圖形"去描述他們?

如果你使用一些上層的可視化庫(kù),你會(huì)發(fā)現(xiàn)他們會(huì)在圖表類型層面歸類,這無(wú)疑讓你能快速作圖。但缺點(diǎn)就是無(wú)法隨心所欲定制化圖表。

而 matplotlib  提供了底層"圖形"的控制,同時(shí)也提供了基本圖表操作。

首先看看如何做出堆積圖,下面以2個(gè)系列作為示例:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 行7:使用 Axes.bar 方法可以畫出柱狀圖,其中 bottom 參數(shù)決定了每個(gè)柱子的起始位置,默認(rèn)情況下全是0

  • 行11:當(dāng)畫第二個(gè)系列時(shí),只要把第一個(gè)系列的 y 值設(shè)置為 第二系列 的 起始點(diǎn),自然而然就做出了堆積圖的效果

圖表如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

知道這個(gè)原理,那么就可以定義通用的函數(shù):

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 本文所有的通用函數(shù)都基于寬表數(shù)據(jù)

  • 行3:通過累計(jì)求和+偏移操作,求出每個(gè)系列的 bottom 值

  • 行5:直接從 DataFrame 中遍歷取出每一列,分別畫柱子。m_color_cycle 是之前定義好的顏色板

行3是基本的 pandas 操作,有興趣可以參考我的 pandas 專欄

調(diào)用如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 行3:原數(shù)據(jù)有多余的列,要選出需要的列,然后按第一年的值,橫向排序一下

圖表如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

基本的圖表做出來(lái),最后再調(diào)整一些細(xì)節(jié)(比如y軸的位置,刻度線等等),因?yàn)檫@些只是一些操作,非常簡(jiǎn)單。

接下來(lái)做泡泡圖


 

圖形屬性映射

數(shù)據(jù)可視化的本質(zhì),實(shí)際是數(shù)據(jù)到圖形元素的映射。

看看之前的堆積圖,我們成功把數(shù)據(jù)中的3種維度數(shù)據(jù)映射上去:

  1. 年份,映射到柱子的水平位置(x軸位置)

  2. 數(shù)值,映射到柱子的高度(調(diào)用 bar 方法時(shí)的參數(shù) height)

  3. 地區(qū),映射到柱子的顏色

看一個(gè)極端的例子。數(shù)據(jù)中還有一列移民人數(shù)(migrant),我們?nèi)匀豢梢酝逊e圖上映射:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

雖然現(xiàn)在圖表看起來(lái)非常奇怪,但的確是可行:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 每一年的柱子寬度與數(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

代碼如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 本文所有通用函數(shù)基于 DataFrame 固定列名。比如數(shù)據(jù)中需要有名為 size 的列,此列作為泡泡的大小。

  • 行6:Axes.scatter 即可畫出圓點(diǎn),參數(shù) s 就是圓點(diǎn)的半徑

  • 參數(shù) clip_on 設(shè)置為 False,可以防止圓點(diǎn)太大超出了可視區(qū)被裁剪

調(diào)用如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 行6:把列名修改合適

  • 行7:參數(shù)y,決定泡泡的位置。注意這里的 -25 是對(duì)應(yīng)圖表上y軸的數(shù)值

看看圖表:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

下一步,加上中間連接修飾的矩形框


 

畫圖形

matplotlib 內(nèi)置了許多基本圖形,因此創(chuàng)建圖形不是什么難事:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 這是在

  • 行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 軸的是字符串:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

此時(shí)坐標(biāo)系 x 軸被 matplotlib 轉(zhuǎn)成 0 開始的升序編碼

matplotlib 有6種坐標(biāo)系轉(zhuǎn)換,這是最重要的核心機(jī)制,這里不深入講解

看看效果:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
  • 矩形左下角在 第一個(gè)柱子中間,y 軸點(diǎn)40的位置

  • 高度剛好占 y 軸 20個(gè)單位的長(zhǎng)度

  • 寬度剛好是 10 個(gè)柱子寬度總和

知道了原理,那么需求就非常容易了:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

看看效果:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

非常好,為泡泡圖加上數(shù)據(jù)標(biāo)簽,原理與之前一樣:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  
Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

最后,按要求調(diào)整軸的細(xì)節(jié)即可:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

完整調(diào)用如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

效果如下:

Python數(shù)據(jù)可視化實(shí)現(xiàn)泡泡堆積關(guān)聯(lián)圖  

你會(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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI