Python基于Matplotlib繪制餅圖的詳細教程
引言
餅圖是數據可視化中經典的占比類圖表,核心用于展示各分類在整體中的比例關系,尤其適合類別數量較少(建議不超過8類)的場景。本文基于Matplotlib詳解餅圖的繪制方法,涵蓋基礎繪制、樣式定制、進階優(yōu)化等核心知識點,結合實戰(zhàn)案例讓你快速掌握。
一、基礎餅圖繪制
1. 核心語法與最簡示例
Matplotlib繪制餅圖的核心函數是plt.pie(),只需傳入“各分類數值”即可生成基礎餅圖。 示例:展示某電商平臺各品類銷售額占比
import matplotlib.pyplot as plt
# 解決中文顯示問題(通用配置)
plt.rcParams["font.sans-serif"] = ["SimHei"] # Windows
# plt.rcParams["font.sans-serif"] = ["PingFang SC"] # macOS
plt.rcParams["axes.unicode_minus"] = False
# 1. 準備數據:分類名稱 + 對應數值(數值會自動計算占比)
categories = ["服飾", "美妝", "食品", "數碼", "家居"]
sales = [250, 180, 220, 300, 150]
# 2. 創(chuàng)建畫布
plt.figure(figsize=(8, 8)) # 餅圖建議用正方形畫布,避免變形
# 3. 繪制基礎餅圖
plt.pie(sales, # 核心數據:各分類數值
labels=categories) # 分類標簽
# 4. 顯示圖表
plt.title("某電商平臺各品類銷售額占比", fontsize=14)
plt.show()
2. 核心參數解析(基礎版)
| 參數 | 作用 | 示例 |
|---|---|---|
x | 必選,各分類的數值(非占比,Matplotlib自動計算) | x=[250, 180, 220] |
labels | 分類標簽,對應x的每個數值 | labels=["服飾","美妝","食品"] |
autopct | 顯示各部分占比,支持格式字符串 | autopct="%1.1f%%"(保留1位小數的百分比) |
colors | 自定義各扇區(qū)顏色 | colors=["#FF6B6B","#4ECDC4","#45B7D1"] |
startangle | 餅圖起始角度(默認從x軸正方向開始,逆時針繪制) | startangle=90(從y軸正方向開始) |
優(yōu)化版基礎餅圖(添加占比、自定義顏色):
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
categories = ["服飾", "美妝", "食品", "數碼", "家居"]
sales = [250, 180, 220, 300, 150]
# 自定義配色(推薦莫蘭迪/清新色系,避免刺眼)
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
plt.figure(figsize=(8, 8))
# 繪制餅圖,添加占比和顏色
plt.pie(sales,
labels=categories,
autopct="%1.1f%%", # 顯示占比(1位小數)
colors=colors,
startangle=90) # 起始角度90度
plt.title("某電商平臺各品類銷售額占比", fontsize=14)
plt.axis("equal") # 強制餅圖為正圓形(關鍵!避免拉伸變形)
plt.show()
二、進階優(yōu)化:突出重點、提升可讀性
1. 突出核心分類(explode參數)
通過explode參數可將指定扇區(qū)“分離”出來,突出重點類別(如占比最高的“數碼”品類):
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
categories = ["服飾", "美妝", "食品", "數碼", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
# explode:對應每個扇區(qū)的分離距離,0為不分離,數值越大分離越遠
explode = (0, 0, 0, 0.1, 0) # 僅“數碼”扇區(qū)分離0.1距離
plt.figure(figsize=(8, 8))
plt.pie(sales,
labels=categories,
autopct="%1.1f%%",
colors=colors,
startangle=90,
explode=explode, # 啟用分離效果
shadow=True) # 添加陰影,增強立體感
plt.title("某電商平臺各品類銷售額占比(突出數碼品類)", fontsize=14)
plt.axis("equal")
plt.show()
2. 優(yōu)化標簽樣式(字體、位置)
默認標簽可能重疊或樣式單一,可通過textprops調整標簽樣式,或手動調整占比標簽位置:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
categories = ["服飾", "美妝", "食品", "數碼", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
explode = (0, 0, 0, 0.1, 0)
plt.figure(figsize=(8, 8))
# 繪制餅圖并捕獲文本對象(用于后續(xù)調整)
patches, texts, autotexts = plt.pie(
sales,
labels=categories,
autopct="%1.1f%%",
colors=colors,
startangle=90,
explode=explode,
shadow=True,
textprops={"fontsize": 11} # 統(tǒng)一設置標簽字體大小
)
# 單獨調整占比標簽樣式(如顏色、加粗)
for autotext in autotexts:
autotext.set_color("white") # 占比文字設為白色
autotext.set_fontweight("bold") # 加粗
plt.title("某電商平臺各品類銷售額占比", fontsize=14)
plt.axis("equal")
plt.show()
3. 處理小占比類別(避免標簽重疊)
若部分類別占比過?。ㄈ?lt;5%),可將其合并為“其他”類,或通過pctdistance調整占比標簽位置:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 原始數據:含小占比類別
categories = ["服飾", "美妝", "食品", "數碼", "家居", "圖書", "配飾"]
sales = [250, 180, 220, 300, 150, 30, 20]
# 合并小占比類別(圖書+配飾=其他)
new_categories = ["服飾", "美妝", "食品", "數碼", "家居", "其他"]
new_sales = [250, 180, 220, 300, 150, 50]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57", "#DDA0DD"]
plt.figure(figsize=(8, 8))
plt.pie(new_sales,
labels=new_categories,
autopct="%1.1f%%",
colors=colors,
startangle=90,
pctdistance=0.85) # 占比標簽距離圓心的比例(默認0.6,調大避免重疊)
plt.title("某電商平臺各品類銷售額占比(合并小品類)", fontsize=14)
plt.axis("equal")
plt.show()
三、特殊場景:環(huán)形餅圖(空心餅圖)
環(huán)形餅圖比普通餅圖更美觀,且可在中心添加文字,適合展示多層占比或突出視覺效果。 實現原理:繪制兩個餅圖,外層為數據,內層為白色填充的“空心”。
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
categories = ["服飾", "美妝", "食品", "數碼", "家居"]
sales = [250, 180, 220, 300, 150]
colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"]
plt.figure(figsize=(8, 8))
# 繪制外層數據餅圖
plt.pie(sales,
labels=categories,
autopct="%1.1f%%",
colors=colors,
startangle=90,
wedgeprops={"width": 0.3}) # width:環(huán)形寬度(0-1,越小越細)
# 繪制內層空心(白色填充)
plt.pie([1], colors="white", radius=0.7) # radius:內層半徑(小于外層)
# 中心添加文字
plt.text(0, 0, "總銷售額\n1100萬", ha="center", va="center", fontsize=12)
plt.title("某電商平臺各品類銷售額占比(環(huán)形圖)", fontsize=14)
plt.axis("equal")
plt.show()
四、餅圖繪制注意事項
- 適用場景:僅用于展示“部分-整體”關系,且類別數不宜過多(建議≤6類),否則扇區(qū)過小、可讀性差;
- 避免誤導:餅圖的視覺效果易受起始角度、扇區(qū)順序影響,若需精準對比占比,優(yōu)先用柱狀圖;
- 正圓形保障:務必添加
plt.axis("equal"),否則畫布拉伸會導致餅圖變形為橢圓; - 中文與負號:始終配置
rcParams解決中文亂碼和負號顯示問題; - 保存高清圖:用
plt.savefig("餅圖.png", dpi=300, bbox_inches="tight")替代plt.show(),避免文字截斷。
以上就是Python基于Matplotlib繪制餅圖的詳細教程的詳細內容,更多關于Python Matplotlib繪制餅圖的資料請關注腳本之家其它相關文章!
相關文章
Python高級編程之消息隊列(Queue)與進程池(Pool)實例詳解
這篇文章主要介紹了Python高級編程之消息隊列(Queue)與進程池(Pool),結合實例形式詳細分析了Python消息隊列與進程池的相關原理、使用技巧與操作注意事項,需要的朋友可以參考下2019-11-11

