在Python中繪制帶有連接線的雙餅圖(操作代碼)
一、導(dǎo)入所需的庫(kù)
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import ConnectionPatch from matplotlib import cm
matplotlib.patches 模塊中的 ConnectionPatch 類(lèi)可以用來(lái)繪制兩個(gè)子圖之間的連線。在雙餅圖等可視化中,可以利用這個(gè)類(lèi)來(lái)繪制兩個(gè)子圖之間的連線,用以表達(dá)它們之間的關(guān)系。該類(lèi)提供了許多參數(shù)和方法,可以用來(lái)控制連線的樣式和位置等屬性。
ConnectionPatch 用于在 Matplotlib 中添加連線,其主要參數(shù)如下:
- xyA:連接線的起始點(diǎn);
- xyB:連接線的結(jié)束點(diǎn);
- coordsA:起始點(diǎn)的坐標(biāo)系,默認(rèn)為 data;
- coordsB:結(jié)束點(diǎn)的坐標(biāo)系,默認(rèn)為 data;
- axesA:起始點(diǎn)所在的 Axes 對(duì)象;
- axesB:結(jié)束點(diǎn)所在的 Axes 對(duì)象;
- color:連接線的顏色;
- linewidth:連接線的線寬;
- linestyle:連接線的線型。
ConnectionPatch 的常用方法包括:
set_color:設(shè)置連接線的顏色;set_linewidth:設(shè)置連接線的線寬;set_linestyle:設(shè)置連接線的線型。
更多參數(shù)和方法可以參考 Matplotlib 官方文檔:
https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.ConnectionPatch.html
cm是Matplotlib的顏色映射模塊,它提供了一系列的顏色方案,包括了單色調(diào),分段調(diào)色和連續(xù)漸變調(diào)色等多種顏色方案,能夠更好的滿足數(shù)據(jù)可視化中的需求。
二、準(zhǔn)備數(shù)據(jù)
# 大餅圖數(shù)據(jù) labels = ['301', '302', '303', '304', '305', '307', '308', '306'] size = [219324, 94739, 75146, 71831, 54051, 21458, 9990, 50843] # 大餅圖分裂距離 explode = (0, 0, 0, 0, 0, 0, 0, 0.1) # 小餅圖數(shù)據(jù) labels2 = ['402', '407'] size2 = [12255, 207069] width = 0.2
這段代碼用于定義大餅圖和小餅圖的數(shù)據(jù),并設(shè)置大餅圖的分裂距離和小餅圖的寬度。
具體解釋如下:
- labels:定義大餅圖每個(gè)分裂塊的標(biāo)簽,即分別表示哪個(gè)區(qū)域。
- size:定義大餅圖每個(gè)分裂塊的大小,即表示每個(gè)區(qū)域的數(shù)量或占比。
- explode:定義大餅圖每個(gè)分裂塊距離餅心的距離,即分裂塊是否需要彈出,這里設(shè)置為不彈出。
- labels2:定義小餅圖每個(gè)分裂塊的標(biāo)簽,即分別表示哪個(gè)區(qū)域。
- size2:定義小餅圖每個(gè)分裂塊的大小,即表示每個(gè)區(qū)域的數(shù)量或占比。
- width:定義小餅圖的寬度,這里設(shè)置為0.2。
三、繪制雙餅圖
3.1 創(chuàng)建畫(huà)布和子圖對(duì)象
fig = plt.figure(figsize=(9, 5)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122)
這部分代碼創(chuàng)建了一個(gè)大小為 (9, 5) 的畫(huà)布 fig,并在該畫(huà)布上添加了兩個(gè)子圖 ax1 和 ax2。
其中,fig.add_subplot(121) 表示將畫(huà)布分為 1 行 2 列的子圖,選擇第 1 個(gè)子圖(即左邊的子圖);fig.add_subplot(122) 則表示選擇第 2 個(gè)子圖(即右邊的子圖)。子圖的編號(hào)規(guī)則類(lèi)似于數(shù)組索引,行號(hào)從上到下從 1 開(kāi)始遞增,列號(hào)從左到右從 1 開(kāi)始遞增,如 (1, 1) 表示第一行第一列的子圖,(1, 2) 表示第一行第二列的子圖。在這里 121 和 122 分別表示第一行的第一個(gè)子圖和第二個(gè)子圖。
3.2 繪制大餅圖
ax1.pie(size,
autopct='%1.1f%%',
startangle=30,
labels=labels,
colors=cm.Blues(range(10, 300, 50)),
explode=explode)這段代碼用于在第一個(gè)子圖(ax1)中繪制一個(gè)餅圖。具體參數(shù)的含義如下:
- size: 餅圖的數(shù)據(jù),表示每個(gè)餅圖塊的大小。
- autopct: 餅圖塊的數(shù)據(jù)標(biāo)簽格式,“%1.1f%%” 表示保留一位小數(shù)并添加百分號(hào)。
- startangle: 餅圖塊的開(kāi)始角度,30度為起始點(diǎn),順時(shí)針?lè)较蛐D(zhuǎn)。
- labels: 餅圖塊的標(biāo)簽,與 size 對(duì)應(yīng)。
- colors: 餅圖塊的顏色,使用了 cm.Blues() 函數(shù)生成一個(gè)顏色列表。
- explode: 餅圖塊的分裂距離,表示是否與餅圖中心分離。例如 (0, 0, 0, 0, 0, 0, 0, 0.1) 表示最后一個(gè)餅圖塊與中心分離 0.1 個(gè)半徑長(zhǎng)度。
可以根據(jù)需要調(diào)整這些參數(shù)以及其他餅圖的參數(shù)來(lái)獲得所需的效果。
3.3 繪制小餅圖
ax2.pie(size2,
autopct='%1.1f%%',
startangle=90,
labels=labels2,
colors=cm.Blues(range(10, 300, 50)),
radius=0.5,
shadow=False)這段代碼用于繪制第二個(gè)小餅圖。具體參數(shù)含義如下:
- size2:小餅圖的數(shù)據(jù),即 [12255, 207069];
- autopct:格式化鍥形塊的數(shù)據(jù)標(biāo)簽,‘%1.1f%%’ 表示保留一位小數(shù),并在后面加上百分號(hào);
- startangle:小餅圖的起始角度,以度數(shù)表示,這里設(shè)為 90 度,即從豎直方向開(kāi)始;
- labels2:小餅圖的標(biāo)簽,即 [‘402’, ‘407’];
- colors:指定顏色,這里使用 cm.Blues 函數(shù)生成一組藍(lán)色系列顏色;
- radius:小餅圖的半徑,這里設(shè)為 0.5;
- shadow:是否添加陰影,這里設(shè)為 False。
在這段代碼中,我們創(chuàng)建了一個(gè)名為 ax2 的子區(qū)域?qū)ο螅⑹褂?pie 方法繪制了一個(gè)小餅圖,將 size2 中的數(shù)據(jù)作為輸入數(shù)據(jù)。其他參數(shù)指定了鍥形塊的格式、顏色、標(biāo)簽等屬性,進(jìn)一步定制了圖形的樣式。
3.4 連接線1,連接大餅圖的上邊緣和小餅圖的餅塊
theta1, theta2 = ax1.patches[-1].theta1, ax1.patches[-1].theta2
center, r = ax1.patches[-1].center, ax1.patches[-1].r
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = np.sin(np.pi / 180 * theta2) + center[1]
con1 = ConnectionPatch(xyA=(0, 0.5),
xyB=(x, y),
coordsA=ax2.transData,
coordsB=ax1.transData,
axesA=ax2, axesB=ax1)這部分代碼是用來(lái)計(jì)算連接兩個(gè)餅圖的連接線的起點(diǎn)和終點(diǎn)位置,并創(chuàng)建一個(gè) ConnectionPatch 對(duì)象用于繪制連接線。
theta1和theta2分別表示餅圖上最后一個(gè)扇形的起始角度和終止角度。center表示餅圖中最后一個(gè)扇形的中心點(diǎn)位置。r表示餅圖的半徑。x和y表示連接線的終點(diǎn)坐標(biāo),其中 x 通過(guò)利用三角函數(shù)計(jì)算出來(lái)。
接下來(lái),ConnectionPatch 的參數(shù)解釋?zhuān)?/p>
- xyA 表示連接線的起點(diǎn)位置,這里設(shè)為 (0, 0.5) 表示在小餅圖上以它的左邊中間位置為起點(diǎn)。
- xyB 表示連接線的終點(diǎn)位置,這里為 (x, y) 表示在大餅圖上以計(jì)算得到的 x 和 y 為終點(diǎn)位置。
- coordsA 和 coordsB 表示起點(diǎn)和終點(diǎn)所在的坐標(biāo)系,這里分別為小餅圖和大餅圖的坐標(biāo)系。
- axesA 和 axesB 分別表示起點(diǎn)和終點(diǎn)所在的子圖對(duì)象,這里分別為小餅圖和大餅圖的子圖對(duì)象,即 ax2 和 ax1。
3.5 連接線2,連接大餅圖的下邊緣和小餅圖的餅塊
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = np.sin(np.pi / 180 * theta1) + center[1]
con2 = ConnectionPatch(xyA=(-0.1, -0.49),
xyB=(x, y),
coordsA='data',
coordsB='data',
axesA=ax2, axesB=ax1)這段代碼用于創(chuàng)建連接線的第二個(gè)對(duì)象con2。具體解釋如下:
- x 和 y 分別代表了連接線從小餅圖中(-0.1,-0.49)這個(gè)點(diǎn)出發(fā),到大餅圖中theta1角度對(duì)應(yīng)的點(diǎn)的終點(diǎn)坐標(biāo)。其中,theta1是通過(guò)訪問(wèn)ax1.patches[-1].theta1獲得的。
- coordsA 和 coordsB 表示終點(diǎn)和起點(diǎn)坐標(biāo)的坐標(biāo)系類(lèi)型。這里都是 ‘data’ 表示使用數(shù)據(jù)坐標(biāo)系,即默認(rèn)的 x 和 y 坐標(biāo)值。
- axesA 和 axesB 表示終點(diǎn)和起點(diǎn)所在的子圖對(duì)象。其中,axesA 為小餅圖,axesB 為大餅圖。
- 這里使用ConnectionPatch函數(shù)創(chuàng)建連接線對(duì)象。
3.6 添加連接線
for con in [con1, con2]:
con.set_color('gray')
ax2.add_artist(con)
con.set_linewidth(1)這段代碼用于設(shè)置連接線的顏色和粗細(xì),并將連接線添加到小餅圖的坐標(biāo)系上。具體來(lái)說(shuō),循環(huán)遍歷連接線對(duì)象列表 [con1, con2],并依次對(duì)每個(gè)連接線進(jìn)行以下操作:
- 調(diào)用
set_color()方法設(shè)置連接線的顏色為灰色。 - 調(diào)用
ax2.add_artist()方法將連接線添加到小餅圖的坐標(biāo)系上。 - 調(diào)用
set_linewidth()方法設(shè)置連接線的寬度為 1。
3.7 調(diào)整子圖布局
fig.subplots_adjust(wspace=0) plt.show()
這行代碼調(diào)整了子圖之間的水平間距,將間距設(shè)置為0,即將子圖緊密排列。wspace參數(shù)表示子圖之間的寬度間距。具體來(lái)說(shuō),這行代碼將第一個(gè)子圖和第二個(gè)子圖之間的間距設(shè)置為0,使它們之間沒(méi)有空隙。
四、源代碼
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import ConnectionPatch
from matplotlib import cm
# 大餅圖數(shù)據(jù)
labels = ['301', '302', '303', '304', '305', '307', '308', '306']
size = [219324, 94739, 75146, 71831, 54051, 21458, 9990, 50843]
# 大餅圖分裂距離
explode = (0, 0, 0, 0, 0, 0, 0, 0.1)
# 小餅圖數(shù)據(jù)
labels2 = ['402', '407']
size2 = [12255, 207069]
width = 0.2
# 創(chuàng)建畫(huà)布和子圖對(duì)象
fig = plt.figure(figsize=(9, 5))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
# 繪制大餅圖
ax1.pie(size,
autopct='%1.1f%%',
startangle=30,
labels=labels,
colors=cm.Blues(range(10, 300, 50)),
explode=explode)
# 繪制小餅圖
ax2.pie(size2,
autopct='%1.1f%%',
startangle=90,
labels=labels2,
colors=cm.Blues(range(10, 300, 50)),
radius=0.5,
shadow=False)
# 連接線1,連接大餅圖的上邊緣和小餅圖的餅塊
theta1, theta2 = ax1.patches[-1].theta1, ax1.patches[-1].theta2
center, r = ax1.patches[-1].center, ax1.patches[-1].r
x = r * np.cos(np.pi / 180 * theta2) + center[0]
y = np.sin(np.pi / 180 * theta2) + center[1]
con1 = ConnectionPatch(xyA=(0, 0.5),
xyB=(x, y),
coordsA=ax2.transData,
coordsB=ax1.transData,
axesA=ax2, axesB=ax1)
# 連接線2,連接大餅圖的下邊緣和小餅圖的餅塊
x = r * np.cos(np.pi / 180 * theta1) + center[0]
y = np.sin(np.pi / 180 * theta1) + center[1]
con2 = ConnectionPatch(xyA=(-0.1, -0.49),
xyB=(x, y),
coordsA='data',
coordsB='data',
axesA=ax2, axesB=ax1)
# 添加連接線
for con in [con1, con2]:
con.set_color('gray')
ax2.add_artist(con)
con.set_linewidth(1)
# 調(diào)整子圖布局
fig.subplots_adjust(wspace=0)
# 顯示圖像
plt.show()可視化結(jié)果為:

到此這篇關(guān)于如何在Python中繪制帶有連接線的雙餅圖的文章就介紹到這了,更多相關(guān)Python雙餅圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python針對(duì)給定字符串求解所有子序列是否為回文序列的方法
這篇文章主要介紹了Python針對(duì)給定字符串求解所有子序列是否為回文序列的方法,涉及Python針對(duì)字符串的遍歷、判斷、運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-04-04
如何一鍵理清大型Python項(xiàng)目依賴(lài)樹(shù)
這篇文章主要介紹了如何一鍵理清大型Python項(xiàng)目依賴(lài)樹(shù),文章圍繞主題相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下2022-06-06
python環(huán)境路徑配置以及命令行運(yùn)行腳本
這篇文章主要為大家詳細(xì)介紹了python環(huán)境路徑配置以及命令行運(yùn)行腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Python序列之list和tuple常用方法以及注意事項(xiàng)
這篇文章主要介紹了Python序列之list和tuple常用方法以及注意事項(xiàng),sequence(序列)是一組有順序的對(duì)象的集合,序列可以包含一個(gè)或多個(gè)元素,也可以沒(méi)有任何元素,序列有兩種:list (表) 和 tuple(元組),需要的朋友可以參考下2015-01-01
Python3+Requests+Excel完整接口自動(dòng)化測(cè)試框架的實(shí)現(xiàn)
這篇文章主要介紹了Python3+Requests+Excel完整接口自動(dòng)化測(cè)試框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
pytorch中forwod函數(shù)在父類(lèi)中的調(diào)用方式解讀
這篇文章主要介紹了pytorch中forwod函數(shù)在父類(lèi)中的調(diào)用方式解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python threading Local()函數(shù)用法案例詳解
這篇文章主要介紹了Python threading Local()函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

