自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在matplotlib中加注釋和內(nèi)嵌圖

開發(fā) 后端
這篇文章會以一個(gè)實(shí)際的案例,詳細(xì)講講如何給數(shù)據(jù)加注解,同時(shí)也介紹一下一種比較騷的操作,即Matplotlib的內(nèi)嵌圖(把一張小圖嵌入到一張大圖中),學(xué)會這個(gè)后,你能夠繪制出這種圖形。

[[331954]]

 在用Matplotlib進(jìn)行可視化過程中,很多時(shí)候?yàn)榱烁庇^地展現(xiàn)數(shù)據(jù)大小,會將具體的數(shù)值標(biāo)注在圖形中,比如在柱狀圖上標(biāo)明數(shù)值大小。

這篇文章會以一個(gè)實(shí)際的案例,詳細(xì)講講如何給數(shù)據(jù)加注解,同時(shí)也介紹一下一種比較騷的操作,即Matplotlib的內(nèi)嵌圖(把一張小圖嵌入到一張大圖中),學(xué)會這個(gè)后,你能夠繪制出這種圖形

數(shù)據(jù)注釋

演示的數(shù)據(jù)集為2016年抵美(到達(dá)美國)人數(shù)排名前十的國家數(shù)據(jù),包含國名和具體入境人數(shù),人數(shù)的具體單位為百萬人次 

  1. import pandas as pd  
  2. import numpy as np  
  3. import matplotlib.pyplot as plt  
  4. %matplotlib inline  
  5. plt.rcParams['font.sans-serif'] = 'SimHei' 
  6. x_data = ['加拿大','墨西哥','英國','日本','中國','德國','韓國','法國','巴西','印度']  
  7. y_data = [13.428347,12.255948,3.019111,2.352919,2.09833,1.322882,1.282097,1.127868,1.109066,0.874016] 

有了數(shù)據(jù)后,可以非??斓禺嫵鲆粡堉鶢顖D 

  1. fig,ax = plt.subplots(figsize=(16,6))  
  2. ax.bar(x_data,y_data) 

接下來開始加注釋,即在柱狀圖上顯示具體數(shù)值。在Matplotlib中,為數(shù)據(jù)加上注釋有兩種方式,一種是使用ax.text(),另一種則是ax.annotate()。

ax.text()

ax.text()的主要作用是為圖中加上一些text,也就是文字。不僅是能夠加注釋,只要指定了坐標(biāo),可以在圖上的任何坐標(biāo)加上text。

函數(shù)中的幾個(gè)重要的參數(shù),具體介紹一下

  •  x:x的坐標(biāo)
  •  y:y的坐標(biāo)
  •  s:要加的文字
  •  rotation:文字旋轉(zhuǎn)的角度
  •  fontsize:文字字體大小
  •  fontweight:文字字體粗細(xì)

需要注意的是,每次調(diào)用ax.text()只能生成一個(gè)Text對象,也就是說每次只能加一個(gè)注釋,多個(gè)的話需要寫循環(huán)生成。

所以一般加注釋是這么一個(gè)流程:先確定注釋的橫縱坐標(biāo)-->寫循環(huán)調(diào)用ax.text() 

  1. fig,ax = plt.subplots(figsize=(16,6))  
  2. ax.bar(x_data,y_data)  
  3. # 循環(huán)生成text  
  4. # horizontalalignment參數(shù)設(shè)置注釋居中顯示  
  5. for x,y in zip(x_data,y_data):  
  6.     ax.text(x,y+0.05,y,fontsize=14,horizontalalignment='center'

關(guān)于圖表美化方面,這里暫時(shí)不過多贅述。

ax.annotate()

相比于ax.text(),ax.annotate()更像是專門為做注釋而生的,annotate便是注釋的意思。

ax.annotate()的注釋功能更強(qiáng)大,除了加入文本注釋外,如果有需要還能夠加上箭頭→進(jìn)行指示。

一些主要的參數(shù)如下:

  •  s:注釋文本
  •  xy:要加注釋的數(shù)據(jù)點(diǎn)位置
  •  xytext:文本注釋的位置,默認(rèn)情況下為xy
  •  arrowprops:一個(gè)控制箭頭的屬性的dict,如果需要顯示箭頭,必須要設(shè)置

這里比較有意思的兩個(gè)參數(shù)是xy和xytext,二者貌似沒啥區(qū)別的樣子,這個(gè)地方確實(shí)很容易產(chǎn)生困惑。

一般情況下,s和xy是必須要設(shè)置的參數(shù),如果不指定,xytext默認(rèn)和xy一致。

但如果要設(shè)置箭頭的話,xy的坐標(biāo)則定義了箭頭的頭部,xytext則指定箭頭的尾部和文本注釋的位置,實(shí)際畫圖來理解看看。

ax.annotate()和ax.text()的畫圖流程是一致的,都需要循環(huán)生成注釋。

不設(shè)置箭頭,簡單加上注釋 

  1. fig,ax = plt.subplots(figsize=(16,6))  
  2. ax.bar(x_data,y_data) 
  3. for x,y in zip(x_data,y_data):  
  4.     ax.annotate(y,(x,y+0.05),fontsize=14,horizontalalignment='center'

加上注釋并設(shè)置箭頭 

  1. fig,ax = plt.subplots(figsize=(16,6))  
  2. ax.bar(x_data,y_data)  
  3. # 箭頭頭部坐標(biāo)(x,y)  
  4. # 箭頭尾部坐標(biāo)(注釋坐標(biāo))為(x,y+1)  
  5. for x,y in zip(x_data,y_data):  
  6.     ax.annotate(y,xy = (x,y),xytext = (x,y+1),fontsize=14,horizontalalignment='center' 
  7.                arrowprops =dict(arrowstyle='->'))  
  8. # 將縱坐標(biāo)范圍擴(kuò)大  
  9. ax.set_ylim([0,16]) 

設(shè)置了顯示箭頭之后,可以明顯地看出,箭頭是由xytext坐標(biāo)指向xy的坐標(biāo)的,所以,當(dāng)你不需要設(shè)置箭頭的時(shí)候,xytext設(shè)置的意義并不大。

內(nèi)嵌圖

內(nèi)嵌圖大家可能用的比較少,但這種圖其實(shí)還是挺有用的。

拿上面的數(shù)據(jù)例子來說,柱狀圖顯示了2016年抵美人數(shù)排名前十的國家的具體人數(shù),如果這時(shí)想結(jié)合各大地域抵美人數(shù)的占比數(shù)據(jù)進(jìn)行分析,該如何繪圖?

一個(gè)比較直接的想法是用subplots子圖來實(shí)現(xiàn),比如上邊顯示柱狀圖,下邊顯示餅圖,如下: 

  1. zhou_name = ['西歐','亞洲','南美洲','大洋洲','加勒比地區(qū)','中東地區(qū)','中美洲','東歐','非洲']  
  2. zhou_percent = [36.2,30.8,13.9,4.3,4.1,3.8,2.8,2.6,1.5]  
  3. fig,ax = plt.subplots(2,1,figsize=(16,12))  
  4. ax[0].bar(x_data,y_data)  
  5. for x,y in zip(x_data,y_data):  
  6.     ax[0].annotate(y,(x,y+0.05),fontsize=14,horizontalalignment='center' 
  7. ax[1].pie(zhou_percent,labels=zhou_name,autopct='%1.1f%%'

這當(dāng)然是可行的,但還有更好的方案,那便是內(nèi)嵌圖。注意到這里的柱狀圖右側(cè)有很大的留白部分,如果把餅圖放到柱狀圖右側(cè)的留白部分會顯得更加直觀。

內(nèi)嵌圖有兩種生成方式,一種是fig.add_axes(),另一種則是使用inset_axes()。

fig.add_axes()

fig.add_axes()就是在原有的Figure上加上一個(gè)新的區(qū)域Axes,然后在這個(gè)區(qū)域中繪制圖形。

使用這個(gè)方法的話需要指定新增的這個(gè)區(qū)域Axes在Figure中的相對位置和區(qū)域大小,輸入?yún)?shù)均為相對于原來Figure的比例值,如下: 

  1. # left和bottom控制新Axes的位置  
  2. # width和height控制新Axes的大小(長寬)  
  3. # 這些均用相對數(shù)來表示,大小在0-1之間  
  4. left,bottom,width,height = [0.5,0.3,0.5,0.5]  
  5. fig,ax1 = plt.subplots(figsize=(16,6))  
  6. ax1.bar(x_data,y_data)  
  7. for x,y in zip(x_data,y_data):  
  8.     ax1.annotate(y,(x,y+0.05),fontsize=14,horizontalalignment='center' 
  9. # 運(yùn)用fig.add_axes()新增一個(gè)區(qū)域Axes繪圖  
  10. ax2 = fig.add_axes([left,bottom,width,height])  
  11. ax2.pie(zhou_percent,labels=zhou_name,autopct='%1.1f%%'

inset_axes

相比于fig.add_axes()需要對相對位置進(jìn)行調(diào)試,使用inset_axes()進(jìn)行繪圖則可以方便進(jìn)行定位。

inset_axes中的位置由參數(shù)loc設(shè)置,可以用字符串控制,也可以輸入數(shù)字,具體如下: 

  1. 'upper right'  : 1  
  2. 'upper left'   : 2  
  3. 'lower left'   : 3 
  4. ...... 
  5. 'upper center' : 9  
  6. 'center'       : 10  
  1. # 使用前需要先導(dǎo)包  
  2. from mpl_toolkits.axes_grid1.inset_locator import inset_axes  
  3. fig,ax1 = plt.subplots(figsize=(16,6))  
  4. ax1.bar(x_data,y_data)  
  5. for x,y in zip(x_data,y_data):  
  6.     ax1.annotate(y,(x,y+0.05),fontsize=14,horizontalalignment='center' 
  7. # 將內(nèi)嵌圖置于右側(cè),寬度和長度分別為相對長度  
  8. ax2 = inset_axes(ax1,width = '60%',height = '60%',loc='right' 
  9. ax2.pie(zhou_percent,labels=zhou_name,autopct='%1.1f%%'

美化方面這里就不再多講了,具體可以參照這篇文章如何用 Matplotlib 畫一張好看的圖。 

 

責(zé)任編輯:龐桂玉 來源: Python中文社區(qū)
相關(guān)推薦

2023-10-19 14:52:27

2023-11-30 20:51:26

多子圖布局matplotlib

2017-02-08 21:20:24

LinuxUbuntu加密硬盤

2013-04-02 15:23:12

2013-11-13 09:22:16

2023-08-28 15:52:10

LinuxPDF

2024-03-25 00:02:00

Android移動開發(fā)視頻

2023-01-18 17:22:38

YAML注釋Linux

2020-02-24 13:06:55

Python數(shù)據(jù)幀開發(fā)

2022-09-26 08:35:53

磁盤Java解密

2013-04-01 15:15:35

Eclipse自動添加Android開發(fā)

2009-11-24 19:33:07

PHP字符串中加入變量

2012-11-30 16:02:57

在vSphereiSCSI存儲虛擬化

2011-10-13 16:34:30

MeeGoQt插件

2011-08-01 15:20:51

SQL Server索引

2011-03-02 17:41:28

2011-03-18 09:48:32

2010-09-07 14:22:41

SQL語句

2015-08-05 09:40:26

2020-05-19 13:55:38

Python加密密碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號