文章目录
- 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. 创建画布 plt.figure(figsize=(8, 8)) # 饼图建议用正方形画布,避免变形 # 3. 绘制基础饼图 plt.pie(sales, # 核心数据:各分类数值 labels=categories) # 分类标签 # 4. 显示图表 plt.title(“某电商平台各品类销售额占比”, fontsize=14) plt.show()
- 参数 作用 示例 x 必选,各分类的数值(非占比,Matplotlib自动计算) x=[250, 180, 220] labels 分类标签,对应x的每个数值 labels=["服饰","美妆","食品"] autopct 显示各部分占比,支持格式字符串 autopct="%1.1f%%"(保留1位小数的百分比) colors 自定义各扇区颜色 colors=["#FF6B6B","#4ECDC4","#45B7D1"] startangle 饼图起始角度(默认从x轴正方向开始,逆时针绘制) startangle=90(从y轴正方向开始) 优化版基础饼图(添加占比、自定义颜色): 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()
- 通过explode参数可将指定扇区“分离”出来,突出重点类别(如占比最高的“数码”品类): 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为不分离,数值越大分离越远 explode = (0, 0, 0, 0.1, 0) # 仅“数码”扇区分离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()
- 默认标签可能重叠或样式单一,可通过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)) # 绘制饼图并捕获文本对象(用于后续调整) patches, texts, autotexts = plt.pie( sales, labels=categories, autopct=”%1.1f%%”, colors=colors, startangle=90, explode=explode, shadow=True, textprops={“fontsize”: 11} # 统一设置标签字体大小 ) # 单独调整占比标签样式(如颜色、加粗) for autotext in autotexts: autotext.set_color(“white”) # 占比文字设为白色 autotext.set_fontweight(“bold”) # 加粗 plt.title(“某电商平台各品类销售额占比”, fontsize=14) plt.axis(“equal”) plt.show()
- 若部分类别占比过小(如<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()
目录
- 引言
- 一、基础饼图绘制
- 1. 核心语法与最简示例
- 2. 核心参数解析(基础版)
- 二、进阶优化:突出重点、提升可读性
- 1. 突出核心分类(explode参数)
- 2. 优化标签样式(字体、位置)
- 3. 处理小占比类别(避免标签重叠)
- 三、特殊场景:环形饼图(空心饼图)
- 四、饼图绘制注意事项
饼图是数据可视化中经典的占比类图表,核心用于展示各分类在整体中的比例关系,尤其适合类别数量较少(建议不超过8类)的场景。本文基于Matplotlib详解饼图的绘制方法,涵盖基础绘制、样式定制、进阶优化等核心知识点,结合实战案例让你快速掌握。
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. 创建画布
plt.figure(figsize=(8, 8)) # 饼图建议用正方形画布,避免变形
# 3. 绘制基础饼图
plt.pie(sales, # 核心数据:各分类数值
labels=categories) # 分类标签
# 4. 显示图表
plt.title("某电商平台各品类销售额占比", fontsize=14)
plt.show()
| 参数 | 作用 | 示例 |
|---|---|---|
x |
必选,各分类的数值(非占比,Matplotlib自动计算) | x=[250, 180, 220] |
labels |
分类标签,对应x的每个数值 | labels=["服饰","美妆","食品"] |
autopct |
显示各部分占比,支持格式字符串 | autopct="%1.1f%%"(保留1位小数的百分比) |
colors |
自定义各扇区颜色 | colors=["#FF6B6B","#4ECDC4","#45B7D1"] |
startangle |
饼图起始角度(默认从x轴正方向开始,逆时针绘制) | startangle=90(从y轴正方向开始) |
优化版基础饼图(添加占比、自定义颜色):
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()
通过explode参数可将指定扇区“分离”出来,突出重点类别(如占比最高的“数码”品类):
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为不分离,数值越大分离越远
explode = (0, 0, 0, 0.1, 0) # 仅“数码”扇区分离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()
默认标签可能重叠或样式单一,可通过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))
# 绘制饼图并捕获文本对象(用于后续调整)
patches, texts, autotexts = plt.pie(
sales,
labels=categories,
autopct="%1.1f%%",
colors=colors,
startangle=90,
explode=explode,
shadow=True,
textprops={"fontsize": 11} # 统一设置标签字体大小
)
# 单独调整占比标签样式(如颜色、加粗)
for autotext in autotexts:
autotext.set_color("white") # 占比文字设为白色
autotext.set_fontweight("bold") # 加粗
plt.title("某电商平台各品类销售额占比", fontsize=14)
plt.axis("equal")
plt.show()
若部分类别占比过小(如<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()
环形饼图比普通饼图更美观,且可在中心添加文字,适合展示多层占比或突出视觉效果。 实现原理:绘制两个饼图,外层为数据,内层为白色填充的“空心”。
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:环形宽度(0-1,越小越细)
# 绘制内层空心(白色填充)
plt.pie([1], colors="white", radius=0.7) # radius:内层半径(小于外层)
# 中心添加文字
plt.text(0, 0, "总销售额n1100万", ha="center", va="center", fontsize=12)
plt.title("某电商平台各品类销售额占比(环形图)", fontsize=14)
plt.axis("equal")
plt.show()
- 适用场景:仅用于展示“部分-整体”关系,且类别数不宜过多(建议≤6类),否则扇区过小、可读性差;
- 避免误导:饼图的视觉效果易受起始角度、扇区顺序影响,若需精准对比占比,优先用柱状图;
- 正圆形保障:务必添加
plt.axis("equal"),否则画布拉伸会导致饼图变形为椭圆;
- 中文与负号:始终配置
rcParams解决中文乱码和负号显示问题;
- 保存高清图:用
plt.savefig("饼图.png", dpi=300, bbox_inches="tight")替代plt.show(),避免文字截断。
plt.axis("equal"),否则画布拉伸会导致饼图变形为椭圆;rcParams解决中文乱码和负号显示问题;plt.savefig("饼图.png", dpi=300, bbox_inches="tight")替代plt.show(),避免文字截断。以上就是Python基于Matplotlib绘制饼图的详细教程的详细内容,更多关于Python Matplotlib绘制饼图的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)
- Python 如何利用pandas和matplotlib绘制饼图
- Python+Matplotlib绘制高亮显示饼图的示例代码
- Python数据分析之 Matplotlib 饼图绘制
- Python+matplotlib绘制饼图和堆叠图