目錄
- Matplotlib 可視化大師系列博客總覽
- Matplotlib 可視化大師系列(五):plt.pie() - 展示組成部分的餅圖
- 一、 餅圖是什么?何時使用(何時避免)?
- 二、 函數原型與核心參數
- 三、 從入門到精通:代碼示例
- 示例 1:基礎餅圖
- 示例 2:環形圖與自定義
- 示例 3:自定義格式化與高級樣式
- 四、 最佳實踐與常見陷阱
- 五、 總結
Matplotlib 可視化大師系列博客總覽
本系列旨在提供一份系統、全面、深入的 Matplotlib 學習指南。以下是博客列表:
- 基礎篇:
plt.plot()
- 繪制折線圖的利刃 - 分布篇:
plt.scatter()
- 探索變量關系的散點圖 - 比較篇:
plt.bar()
與plt.barh()
- 清晰對比的柱狀圖 - 統計篇:
plt.hist()
與plt.boxplot()
- 洞察數據分布 - 占比篇:
plt.pie()
- 展示組成部分的餅圖 - 高級篇:
plt.imshow()
- 繪制矩陣與圖像的強大工具 - 專屬篇: 繪制誤差線 (
plt.errorbar()
)、等高線 (plt.contour()
) 等特殊圖表 - 綜合篇: 在一張圖中組合多種圖表類型
Matplotlib 可視化大師系列(五):plt.pie() - 展示組成部分的餅圖
餅圖是一種經典的圖表類型,用于顯示一個整體中各個組成部分的比例或百分比關系。雖然近年來餅圖的使用受到一些爭議(尤其在數據可視化專家中),但在恰當的場景下,它仍然是一種直觀有效的工具。Matplotlib 通過 plt.pie()
函數提供了創建餅圖的功能。
一、 餅圖是什么?何時使用(何時避免)?
餅圖是一個圓形圖表,被分割成多個扇形區域,每個扇形的弧長(以及面積)代表其部分占總體的比例。所有扇形的比例加起來是100%。
適用場景(謹慎使用!):
- 顯示2-5個組成部分占整體的百分比。
- 當需要強調一個部分與整體的關系時(例如,市場份額超過50%)。
- 組成部分的百分比差異足夠大,以便在視覺上區分。
避免使用的情況:
- 有太多(>6個) 類別。小的扇形難以比較和標注。
- 當類別比例非常接近時(例如,28%, 29%, 30%),人眼很難分辨扇形大小。
- 當需要精確比較不同部分的大小時(條形圖通常更擅長比較)。
- 當數據不構成一個完整的"整體"時。
二、 函數原型與核心參數
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, **kwargs)
核心參數詳解:
- 數據與標簽:
x
: 一維數組,每個元素代表一個扇形的大小(比例會自動計算)。labels
: 一個字符串序列,為每個扇形指定標簽。colors
: 一個顏色序列,用于指定每個扇形的顏色。
- 百分比與格式:
autopct
: 非常有用的參數,用于在扇形內顯示百分比。None
(默認): 不顯示。'%1.1f%%'
: 顯示一位小數的百分比(如 ‘15.2%’)。'%1.0f%%'
: 顯示整數百分比。- 函數: 可以自定義一個函數來格式化顯示內容。
pctdistance
: 百分比文本離圓心的距離比例(默認0.6)。labeldistance
: 標簽文本離圓心的距離比例(默認1.1)。
- 外觀與布局:
explode
: 一個長度與x
相同的數組,指定每個扇形偏離圓心的距離。例如[0, 0.1, 0, 0]
會讓第二個扇形突出顯示。startangle
: 起始繪制角度(度),從正東方向(3點鐘方向) 開始逆時針旋轉。默認0。shadow
: 如果True
,為餅圖添加陰影效果(通常不推薦,顯得過時)。wedgeprops
: 一個字典,用于設置扇形屬性,如邊緣顏色(edgecolor
)、線寬(linewidth
)等。推薦使用wedgeprops={'edgecolor': 'black', 'linewidth': 1}
來為扇形添加黑色邊框,提高可讀性。textprops
: 一個字典,用于設置標簽和百分比文本的屬性,如字體大小(fontsize
)、顏色(color
)等。
- 尺寸與位置:
radius
: 餅圖的半徑,用于控制大小。center
: 餅圖的中心點坐標。frame
: 如果True
,在餅圖周圍繪制坐標軸框架(幾乎從不使用)。
三、 從入門到精通:代碼示例
示例 1:基礎餅圖
import matplotlib.pyplot as plt# 數據
sizes = [15, 30, 25, 10, 20] # 這些值會自動計算百分比
labels = ['Python', 'JavaScript', 'Java', 'C++', 'Others']
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'plum']
explode = (0, 0.1, 0, 0, 0) # 只"突出"第二部分 'JavaScript'fig, ax = plt.subplots(figsize=(8, 8))# 繪制餅圖
wedges, texts, autotexts = ax.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.1f%%',shadow=False, # 避免使用陰影startangle=90, # 從90度(正北)開始wedgeprops={'edgecolor': 'black', 'linewidth': 1} # 添加邊框)# 美化百分比文本
for autotext in autotexts:autotext.set_color('black')autotext.set_fontsize(10)autotext.set_weight('bold')ax.set_title('Popular Programming Languages', fontsize=14)
# 確保餅圖是正圓形
ax.axis('equal')plt.tight_layout()
plt.show()
示例 2:環形圖與自定義
環形圖(Donut Chart)是餅圖的一種變體,中間有一個空洞,通常用于顯示多個系列或使視覺效果更輕盈。
# 數據
sizes = [15, 30, 25, 10, 20]
labels = ['Python', 'JavaScript', 'Java', 'C++', 'Others']
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#ff99cc']fig, ax = plt.subplots(figsize=(8, 8))# 先畫一個普通的餅圖
wedges, texts, autotexts = ax.pie(sizes,labels=labels,colors=colors,autopct='%1.1f%%',startangle=90,pctdistance=0.85, # 百分比放遠一點wedgeprops=dict(width=0.4, edgecolor='w') # 關鍵:width設置環的寬度)# 在中心畫一個白色的圓,使其看起來像環形圖
centre_circle = plt.Circle((0,0), 0.70, fc='white')
ax.add_artist(centre_circle)# 另一種添加中心文本的方法
ax.text(0, 0, 'Languages', ha='center', va='center', fontsize=16, fontweight='bold')ax.axis('equal')
plt.title('Donut Chart Example', fontsize=14)
plt.tight_layout()
plt.show()
示例 3:自定義格式化與高級樣式
from matplotlib import cm
import numpy as np# 數據
data = [35, 25, 20, 15, 5]
categories = ['Electronics', 'Clothing', 'Food', 'Books', 'Other']# 創建一個顏色映射
colors = cm.Set3(np.linspace(0, 1, len(data)))fig, ax = plt.subplots(figsize=(9, 9))# 自定義百分比顯示函數
def make_autopct(values):def my_autopct(pct):total = sum(values)val = int(round(pct*total/100.0))# 同時顯示百分比和實際值return '{p:.1f}%\n({v:d})'.format(p=pct, v=val)return my_autopctwedges, texts, autotexts = ax.pie(data,labels=categories,colors=colors,autopct=make_autopct(data), # 使用自定義函數startangle=140,shadow=False,wedgeprops={'linewidth': 2, 'edgecolor': 'white', 'alpha': 0.9})# 美化文本
for text in texts:text.set_fontsize(11)text.set_fontweight('bold')
for autotext in autotexts:autotext.set_fontsize(9)autotext.set_color('darkblue')plt.title('Sales Distribution by Category', fontsize=16, fontweight='bold')
ax.axis('equal')plt.tight_layout()
plt.show()
四、 最佳實踐與常見陷阱
- 最佳實踐:
- 排序數據: 將數據從大到小排序,通常從12點鐘方向開始,使圖表更易于閱讀。
- 限制類別數量: 堅持使用2-5個主要類別。將小的、不重要的類別合并為"其他"。
- 直接標注: 使用
autopct
或plt.text()
直接在扇形上標注百分比/數值,避免讓讀者依賴圖例。 - 使用顏色: 使用區分度高的顏色,但確保顏色不會傳達錯誤的順序信息(餅圖各部分本質上是無序的)。
- 考慮條形圖: 在決定使用餅圖之前,先問自己一個水平的條形圖是否更能清晰地進行比較。
- 常見陷阱:
- 3D 餅圖: 絕對避免使用3D餅圖。它嚴重扭曲了扇形的感知大小。
- 過多切片: 包含太多類別是餅圖最常見的問題,會導致"餅圖垃圾"。
- 缺少標注: 不提供百分比或數值,迫使讀者猜測比例。
- 誤導性整體: 確保所有部分加起來代表一個有意義的整體(100%)。
五、 總結
plt.pie()
是一個專門用于創建比例圖表的工具。
- 核心功能: 用扇形角度表示部分與整體的比例關系。
- 關鍵參數:
x
(數據),labels
,autopct
(百分比),explode
(突出),startangle
,wedgeprops
(樣式)。 - 高級應用: 環形圖(通過
wedgeprops={'width': x}
)、自定義格式化函數。 - 使用哲學: 謹慎使用。餅圖在特定簡單場景下有效,但在大多數需要精確比較的情況下,條形圖是更優的選擇。
掌握餅圖意味著你知道何時以及如何有效地使用它,更重要的是,知道何時應該避免使用它。在下一篇文章中,我們將探索一個更高級、更強大的函數 plt.imshow()
,用于可視化矩陣數據和圖像。