您好,登錄后才能下訂單哦!
這篇文章主要介紹“在Python中怎么繪制帶有連接線的雙餅圖”,在日常操作中,相信很多人在在Python中怎么繪制帶有連接線的雙餅圖問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”在Python中怎么繪制帶有連接線的雙餅圖”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import ConnectionPatch from matplotlib import cm
matplotlib.patches 模塊中的 ConnectionPatch 類可以用來繪制兩個子圖之間的連線。在雙餅圖等可視化中,可以利用這個類來繪制兩個子圖之間的連線,用以表達(dá)它們之間的關(guān)系。該類提供了許多參數(shù)和方法,可以用來控制連線的樣式和位置等屬性。
ConnectionPatch 用于在 Matplotlib 中添加連線,其主要參數(shù)如下:
xyA:連接線的起始點;
xyB:連接線的結(jié)束點;
coordsA:起始點的坐標(biāo)系,默認(rèn)為 data;
coordsB:結(jié)束點的坐標(biāo)系,默認(rèn)為 data;
axesA:起始點所在的 Axes 對象;
axesB:結(jié)束點所在的 Axes 對象;
color:連接線的顏色;
linewidth:連接線的線寬;
linestyle:連接線的線型。
ConnectionPatch 的常用方法包括:
set_color
:設(shè)置連接線的顏色;
set_linewidth
:設(shè)置連接線的線寬;
set_linestyle
:設(shè)置連接線的線型。
cm是Matplotlib的顏色映射模塊,它提供了一系列的顏色方案,包括了單色調(diào),分段調(diào)色和連續(xù)漸變調(diào)色等多種顏色方案,能夠更好的滿足數(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:定義大餅圖每個分裂塊的標(biāo)簽,即分別表示哪個區(qū)域。
size:定義大餅圖每個分裂塊的大小,即表示每個區(qū)域的數(shù)量或占比。
explode:定義大餅圖每個分裂塊距離餅心的距離,即分裂塊是否需要彈出,這里設(shè)置為不彈出。
labels2:定義小餅圖每個分裂塊的標(biāo)簽,即分別表示哪個區(qū)域。
size2:定義小餅圖每個分裂塊的大小,即表示每個區(qū)域的數(shù)量或占比。
width:定義小餅圖的寬度,這里設(shè)置為0.2。
fig = plt.figure(figsize=(9, 5)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122)
這部分代碼創(chuàng)建了一個大小為 (9, 5) 的畫布 fig,并在該畫布上添加了兩個子圖 ax1 和 ax2。
其中,fig.add_subplot(121)
表示將畫布分為 1 行 2 列的子圖,選擇第 1 個子圖(即左邊的子圖);fig.add_subplot(122)
則表示選擇第 2 個子圖(即右邊的子圖)。子圖的編號規(guī)則類似于數(shù)組索引,行號從上到下從 1 開始遞增,列號從左到右從 1 開始遞增,如 (1, 1) 表示第一行第一列的子圖,(1, 2) 表示第一行第二列的子圖。在這里 121 和 122 分別表示第一行的第一個子圖和第二個子圖。
ax1.pie(size, autopct='%1.1f%%', startangle=30, labels=labels, colors=cm.Blues(range(10, 300, 50)), explode=explode)
這段代碼用于在第一個子圖(ax1)中繪制一個餅圖。具體參數(shù)的含義如下:
size: 餅圖的數(shù)據(jù),表示每個餅圖塊的大小。
autopct: 餅圖塊的數(shù)據(jù)標(biāo)簽格式,“%1.1f%%” 表示保留一位小數(shù)并添加百分號。
startangle: 餅圖塊的開始角度,30度為起始點,順時針方向旋轉(zhuǎn)。
labels: 餅圖塊的標(biāo)簽,與 size 對應(yīng)。
colors: 餅圖塊的顏色,使用了 cm.Blues() 函數(shù)生成一個顏色列表。
explode: 餅圖塊的分裂距離,表示是否與餅圖中心分離。例如 (0, 0, 0, 0, 0, 0, 0, 0.1) 表示最后一個餅圖塊與中心分離 0.1 個半徑長度。
可以根據(jù)需要調(diào)整這些參數(shù)以及其他餅圖的參數(shù)來獲得所需的效果。
ax2.pie(size2, autopct='%1.1f%%', startangle=90, labels=labels2, colors=cm.Blues(range(10, 300, 50)), radius=0.5, shadow=False)
這段代碼用于繪制第二個小餅圖。具體參數(shù)含義如下:
size2:小餅圖的數(shù)據(jù),即 [12255, 207069];
autopct:格式化鍥形塊的數(shù)據(jù)標(biāo)簽,‘%1.1f%%’ 表示保留一位小數(shù),并在后面加上百分號;
startangle:小餅圖的起始角度,以度數(shù)表示,這里設(shè)為 90 度,即從豎直方向開始;
labels2:小餅圖的標(biāo)簽,即 [‘402’, ‘407’];
colors:指定顏色,這里使用 cm.Blues 函數(shù)生成一組藍(lán)色系列顏色;
radius:小餅圖的半徑,這里設(shè)為 0.5;
shadow:是否添加陰影,這里設(shè)為 False。
在這段代碼中,我們創(chuàng)建了一個名為 ax2 的子區(qū)域?qū)ο?,并使?pie 方法繪制了一個小餅圖,將 size2 中的數(shù)據(jù)作為輸入數(shù)據(jù)。其他參數(shù)指定了鍥形塊的格式、顏色、標(biāo)簽等屬性,進(jìn)一步定制了圖形的樣式。
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)
這部分代碼是用來計算連接兩個餅圖的連接線的起點和終點位置,并創(chuàng)建一個 ConnectionPatch 對象用于繪制連接線。
theta1
和 theta2
分別表示餅圖上最后一個扇形的起始角度和終止角度。
center
表示餅圖中最后一個扇形的中心點位置。
r
表示餅圖的半徑。
x
和 y
表示連接線的終點坐標(biāo),其中 x 通過利用三角函數(shù)計算出來。
接下來,ConnectionPatch 的參數(shù)解釋:
xyA 表示連接線的起點位置,這里設(shè)為 (0, 0.5) 表示在小餅圖上以它的左邊中間位置為起點。
xyB 表示連接線的終點位置,這里為 (x, y) 表示在大餅圖上以計算得到的 x 和 y 為終點位置。
coordsA 和 coordsB 表示起點和終點所在的坐標(biāo)系,這里分別為小餅圖和大餅圖的坐標(biāo)系。
axesA 和 axesB 分別表示起點和終點所在的子圖對象,這里分別為小餅圖和大餅圖的子圖對象,即 ax2 和 ax1。
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)建連接線的第二個對象con2。具體解釋如下:
x 和 y 分別代表了連接線從小餅圖中(-0.1,-0.49)這個點出發(fā),到大餅圖中theta1角度對應(yīng)的點的終點坐標(biāo)。其中,theta1是通過訪問ax1.patches[-1].theta1獲得的。
coordsA 和 coordsB 表示終點和起點坐標(biāo)的坐標(biāo)系類型。這里都是 ‘data’ 表示使用數(shù)據(jù)坐標(biāo)系,即默認(rèn)的 x 和 y 坐標(biāo)值。
axesA 和 axesB 表示終點和起點所在的子圖對象。其中,axesA 為小餅圖,axesB 為大餅圖。
這里使用ConnectionPatch函數(shù)創(chuàng)建連接線對象。
for con in [con1, con2]: con.set_color('gray') ax2.add_artist(con) con.set_linewidth(1)
這段代碼用于設(shè)置連接線的顏色和粗細(xì),并將連接線添加到小餅圖的坐標(biāo)系上。具體來說,循環(huán)遍歷連接線對象列表 [con1, con2],并依次對每個連接線進(jìn)行以下操作:
調(diào)用 set_color()
方法設(shè)置連接線的顏色為灰色。
調(diào)用 ax2.add_artist()
方法將連接線添加到小餅圖的坐標(biāo)系上。
調(diào)用 set_linewidth()
方法設(shè)置連接線的寬度為 1。
fig.subplots_adjust(wspace=0) plt.show()
這行代碼調(diào)整了子圖之間的水平間距,將間距設(shè)置為0,即將子圖緊密排列。wspace參數(shù)表示子圖之間的寬度間距。具體來說,這行代碼將第一個子圖和第二個子圖之間的間距設(shè)置為0,使它們之間沒有空隙。
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)建畫布和子圖對象 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中怎么繪制帶有連接線的雙餅圖”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。