欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python中繪制帶有連接線的雙餅圖(操作代碼)

 更新時間:2023年05月04日 10:41:28   作者:旅途中的寬~  
這篇文章主要介紹了如何在Python中繪制帶有連接線的雙餅圖,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、導入所需的庫

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import ConnectionPatch
from matplotlib import cm

matplotlib.patches 模塊中的 ConnectionPatch 類可以用來繪制兩個子圖之間的連線。在雙餅圖等可視化中,可以利用這個類來繪制兩個子圖之間的連線,用以表達它們之間的關系。該類提供了許多參數(shù)和方法,可以用來控制連線的樣式和位置等屬性。

ConnectionPatch 用于在 Matplotlib 中添加連線,其主要參數(shù)如下:

  • xyA:連接線的起始點;
  • xyB:連接線的結束點;
  • coordsA:起始點的坐標系,默認為 data;
  • coordsB:結束點的坐標系,默認為 data;
  • axesA:起始點所在的 Axes 對象;
  • axesB:結束點所在的 Axes 對象;
  • color:連接線的顏色;
  • linewidth:連接線的線寬;
  • linestyle:連接線的線型。

ConnectionPatch 的常用方法包括:

  • set_color:設置連接線的顏色;
  • set_linewidth:設置連接線的線寬;
  • set_linestyle:設置連接線的線型。

更多參數(shù)和方法可以參考 Matplotlib 官方文檔:

https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.ConnectionPatch.html

cm是Matplotlib的顏色映射模塊,它提供了一系列的顏色方案,包括了單色調(diào),分段調(diào)色和連續(xù)漸變調(diào)色等多種顏色方案,能夠更好的滿足數(shù)據(jù)可視化中的需求。

二、準備數(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ù),并設置大餅圖的分裂距離和小餅圖的寬度。

具體解釋如下:

  • labels:定義大餅圖每個分裂塊的標簽,即分別表示哪個區(qū)域。
  • size:定義大餅圖每個分裂塊的大小,即表示每個區(qū)域的數(shù)量或占比。
  • explode:定義大餅圖每個分裂塊距離餅心的距離,即分裂塊是否需要彈出,這里設置為不彈出。
  • labels2:定義小餅圖每個分裂塊的標簽,即分別表示哪個區(qū)域。
  • size2:定義小餅圖每個分裂塊的大小,即表示每個區(qū)域的數(shù)量或占比。
  • width:定義小餅圖的寬度,這里設置為0.2。

三、繪制雙餅圖

3.1 創(chuàng)建畫布和子圖對象

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 分別表示第一行的第一個子圖和第二個子圖。

3.2 繪制大餅圖

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ù)標簽格式,“%1.1f%%” 表示保留一位小數(shù)并添加百分號。
  • startangle: 餅圖塊的開始角度,30度為起始點,順時針方向旋轉。
  • labels: 餅圖塊的標簽,與 size 對應。
  • colors: 餅圖塊的顏色,使用了 cm.Blues() 函數(shù)生成一個顏色列表。
  • explode: 餅圖塊的分裂距離,表示是否與餅圖中心分離。例如 (0, 0, 0, 0, 0, 0, 0, 0.1) 表示最后一個餅圖塊與中心分離 0.1 個半徑長度。

可以根據(jù)需要調(diào)整這些參數(shù)以及其他餅圖的參數(shù)來獲得所需的效果。

3.3 繪制小餅圖

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ù)標簽,‘%1.1f%%’ 表示保留一位小數(shù),并在后面加上百分號;
  • startangle:小餅圖的起始角度,以度數(shù)表示,這里設為 90 度,即從豎直方向開始;
  • labels2:小餅圖的標簽,即 [‘402’, ‘407’];
  • colors:指定顏色,這里使用 cm.Blues 函數(shù)生成一組藍色系列顏色;
  • radius:小餅圖的半徑,這里設為 0.5;
  • shadow:是否添加陰影,這里設為 False。

在這段代碼中,我們創(chuàng)建了一個名為 ax2 的子區(qū)域對象,并使用 pie 方法繪制了一個小餅圖,將 size2 中的數(shù)據(jù)作為輸入數(shù)據(jù)。其他參數(shù)指定了鍥形塊的格式、顏色、標簽等屬性,進一步定制了圖形的樣式。

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)

這部分代碼是用來計算連接兩個餅圖的連接線的起點和終點位置,并創(chuàng)建一個 ConnectionPatch 對象用于繪制連接線。

  • theta1 和 theta2 分別表示餅圖上最后一個扇形的起始角度和終止角度。
  • center 表示餅圖中最后一個扇形的中心點位置。
  • r 表示餅圖的半徑。
  • x 和 y 表示連接線的終點坐標,其中 x 通過利用三角函數(shù)計算出來。

接下來,ConnectionPatch 的參數(shù)解釋:

  • xyA 表示連接線的起點位置,這里設為 (0, 0.5) 表示在小餅圖上以它的左邊中間位置為起點。
  • xyB 表示連接線的終點位置,這里為 (x, y) 表示在大餅圖上以計算得到的 x 和 y 為終點位置。
  • coordsA 和 coordsB 表示起點和終點所在的坐標系,這里分別為小餅圖和大餅圖的坐標系。
  • axesA 和 axesB 分別表示起點和終點所在的子圖對象,這里分別為小餅圖和大餅圖的子圖對象,即 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)建連接線的第二個對象con2。具體解釋如下:

  • x 和 y 分別代表了連接線從小餅圖中(-0.1,-0.49)這個點出發(fā),到大餅圖中theta1角度對應的點的終點坐標。其中,theta1是通過訪問ax1.patches[-1].theta1獲得的。
  • coordsA 和 coordsB 表示終點和起點坐標的坐標系類型。這里都是 ‘data’ 表示使用數(shù)據(jù)坐標系,即默認的 x 和 y 坐標值。
  • axesA 和 axesB 表示終點和起點所在的子圖對象。其中,axesA 為小餅圖,axesB 為大餅圖。
  • 這里使用ConnectionPatch函數(shù)創(chuàng)建連接線對象。

3.6 添加連接線

for con in [con1, con2]:
    con.set_color('gray')
    ax2.add_artist(con)
    con.set_linewidth(1)

這段代碼用于設置連接線的顏色和粗細,并將連接線添加到小餅圖的坐標系上。具體來說,循環(huán)遍歷連接線對象列表 [con1, con2],并依次對每個連接線進行以下操作:

  • 調(diào)用 set_color() 方法設置連接線的顏色為灰色。
  • 調(diào)用 ax2.add_artist() 方法將連接線添加到小餅圖的坐標系上。
  • 調(diào)用 set_linewidth() 方法設置連接線的寬度為 1。

3.7 調(diào)整子圖布局

fig.subplots_adjust(wspace=0)
plt.show()

這行代碼調(diào)整了子圖之間的水平間距,將間距設置為0,即將子圖緊密排列。wspace參數(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()

可視化結果為:

在這里插入圖片描述

到此這篇關于如何在Python中繪制帶有連接線的雙餅圖的文章就介紹到這了,更多相關Python雙餅圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python 常見字符串與函數(shù)的用法詳解

    python 常見字符串與函數(shù)的用法詳解

    這篇文章主要介紹了python 常見字符串與函數(shù)的用法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • 梅爾倒譜系數(shù)(MFCC)實現(xiàn)

    梅爾倒譜系數(shù)(MFCC)實現(xiàn)

    這篇文章主要為大家詳細介紹了梅爾倒譜系數(shù)(MFCC)實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • python 通過麥克風錄音 生成wav文件的方法

    python 通過麥克風錄音 生成wav文件的方法

    今天小編就為大家分享一篇python 通過麥克風錄音 生成wav文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python讀取xlsx文件的實現(xiàn)方法

    Python讀取xlsx文件的實現(xiàn)方法

    這篇文章主要介紹了Python讀取xlsx文件的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • 接口自動化多層嵌套json數(shù)據(jù)處理代碼實例

    接口自動化多層嵌套json數(shù)據(jù)處理代碼實例

    這篇文章主要介紹了接口自動化多層嵌套json數(shù)據(jù)處理代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Python flask路由間傳遞變量實例詳解

    Python flask路由間傳遞變量實例詳解

    這篇文章主要介紹了Python flask路由間傳遞變量實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • python 實現(xiàn)tar文件壓縮解壓的實例詳解

    python 實現(xiàn)tar文件壓縮解壓的實例詳解

    這篇文章主要介紹了python 實現(xiàn)tar文件壓縮解壓的實例詳解的相關資料,這里提供實現(xiàn)方法,幫助大家學習理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • pandas調(diào)整列的順序以及添加列的實現(xiàn)

    pandas調(diào)整列的順序以及添加列的實現(xiàn)

    這篇文章主要介紹了pandas調(diào)整列的順序以及添加列的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python生成短uuid的方法實例詳解

    Python生成短uuid的方法實例詳解

    python的uuid都是32位的,比較長,處理起來效率比較低。這篇文章主要介紹了Python生成短uuid的方法,需要的朋友可以參考下
    2018-05-05
  • Python基礎教程之增加和去除數(shù)字的千位分隔符

    Python基礎教程之增加和去除數(shù)字的千位分隔符

    千位分隔符其實就是數(shù)字中的逗號,下面這篇文章主要給大家介紹了關于Python基礎教程之增加和去除數(shù)字的千位分隔符,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論