Matplotlib 饼图与环形图:占比类数据可视化方法

在数据可视化的体系中,占比类分析是洞察数据构成的核心环节,饼图与环形图则是实现这类分析的经典工具。二者能够直观呈现整体与局部的数量关系,广泛应用于市场份额核算、成本结构拆解、销售渠道贡献度分析等正式科研与商业分析场景。饼图与环形图的底层实现均依托 Matplotlib 的ax.pie()函数,二者在核心参数逻辑上高度一致,仅在视觉呈现形式上存在差异。本文基于 Jupyter Notebook 运行环境,提供全场景可直接执行的代码,系统阐述饼图与环形图的绘制逻辑、样式优化方案,以及多维度对比的实现方式,同时适配学术博文的严谨性与实用性要求。

一、基础饼图绘制与核心参数解析

基础饼图是占比分析的入门形式,能够自动完成数据占比的计算与可视化呈现,适用于类别数量不超过 6 类的简单占比展示场景。当类别数量过多时,饼图的扇区会过于细碎,不仅降低图表可读性,也会影响数据传递的准确性,因此该图表类型更适合核心类别、关键构成的快速展示。

在 Matplotlib 的参数设计中,饼图扇区的样式配置有严格的规范。扇区的边框颜色、边框宽度等属性,并非作为独立参数直接传入ax.pie()函数,而是需要通过wedgeprops字典进行统一封装。这一设计是 Matplotlib 针对饼图这类特殊图表的专属规范,能够保证扇区样式配置的统一性,同时避免参数调用冲突。在代码实现中,首先完成中文与负号显示的全局配置,解决跨系统运行时的字符乱码问题,再完成业务数据的准备,搭配色盲友好的高对比度配色,保证图表的普适性与视觉清晰度。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 全局配置,适配中文与负号正常显示
plt.rcParams.update({
    'font.sans-serif': ['SimHei', 'Arial Unicode Unicode MS'],
    'axes.unicode_minus': False,
    'figure.figsize': (8, 8)
})

# 业务数据定义,类别与数值一一对应
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales = [156, 128, 95, 78, 62]
# 色盲友好配色方案,与类别数量匹配
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd']

# 基础饼图绘制
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(
    x=sales,
    labels=products,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
    counterclock=False,
    wedgeprops={'edgecolor': 'black', 'linewidth': 1}
)

# 占比文本与类别标签样式优化
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
for text in texts:
    text.set_fontsize(12)

ax.set_title('2024年各产品销量占比', fontsize=16, fontweight='bold', pad=20)
plt.show()

ax.pie()函数的核心参数决定了图表的基础呈现效果。x参数接收待分析的数值数据,函数会自动完成占比的归一化计算,无需开发者手动处理数据。labels参数绑定与数值对应的类别标签,实现数据与类别的精准对应。autopct参数用于控制占比文本的显示格式,可根据分析需求调整小数保留位数。startangle设置饼图的起始绘制角度,90 度为行业通用的优选值,让图表从正上方开始绘制,符合大众的阅读习惯。counterclock参数控制扇区的排列方向,设置为 False 时采用顺时针排列,更贴合日常的数据查看逻辑。wedgeprops作为扇区样式的核心配置项,承担边框颜色、边框宽度等关键样式的设置工作。

二、环形图:进阶占比可视化方案

环形图是基础饼图的优化形态,也被称作空心饼图,在正式的学术报告、商业汇报中,应用频率往往高于基础饼图。环形图通过空心设计,减少了视觉上的拥挤感,让各扇区的占比差异更易分辨。同时,环形中心的空白区域可以补充关键统计信息,进一步提升图表的信息密度,让单一图表能够承载更多有效内容。

环形图的绘制逻辑与基础饼图完全一致,核心差异在于wedgeprops字典中新增了width参数。该参数用于控制环形的空心宽度,取值范围在 0.2 至 0.4 之间时,能够达到最佳的视觉效果。取值过小会导致环形过窄,扇区信息展示不完整;取值过大则会无限贴近基础饼图,失去环形图的设计优势。在代码实现中,延续全局配置与数据准备的规范,仅通过调整wedgeprops参数,即可完成从基础饼图到环形图的转换。同时,借助ax.text()函数,在环形中心添加总营收、总样本量等核心汇总数据,让图表的信息表达更完整。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 全局可视化配置
plt.rcParams.update({
    'font.sans-serif': ['SimHei', 'Arial Unicode MS'],
    'axes.unicode_minus': False,
    'figure.figsize': (8, 8)
})

# 销售渠道营收数据准备
channels = ['线上电商', '线下门店', '社交推广', '分销代理', '企业采购']
revenue = [320, 180, 210, 125, 275]
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd']

# 环形图绘制
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(
    x=revenue,
    labels=channels,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
    counterclock=False,
    wedgeprops={
        'width': 0.3,
        'edgecolor': 'black',
        'linewidth': 1
    }
)

# 文本样式优化
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
for text in texts:
    text.set_fontsize(12)

# 环形中心补充核心汇总信息
ax.text(0, 0, '总营收\n1110万元', ha='center', va='center', 
        fontsize=14, fontweight='bold', color='#333333')
ax.set_title('2024年各销售渠道营收占比', fontsize=16, fontweight='bold', pad=20)
plt.show()

环形图的优势不仅体现在视觉层面,更体现在实际的分析场景中。对于占比数值相近的类别,环形图的弧形展示方式,能够比基础饼图更清晰地区分细微差异。同时,空心设计让图表在排版时更具灵活性,适配多图表拼接的报告版式。在学术博文与正式汇报中,优先选择环形图进行占比展示,能够有效提升内容的专业度与可读性。

三、突出扇区饼图:核心类别重点标注

在实际的数据分析工作中,往往需要突出展示核心类别,比如占比最高的产品、贡献度最大的销售渠道、成本占比最高的支出项等。突出扇区饼图通过扇区分离的视觉效果,能够快速抓住阅读者的注意力,实现核心信息的高效传递。这种图表形式适合在汇报、论文的结果展示环节,强调关键结论与核心发现。

突出扇区的实现依托explode参数,该参数是一个与类别数量等长的列表。列表中的每一个元素,对应一个饼图扇区的突出距离。数值 0 代表扇区保持原位,不做突出处理;数值在 0.1 至 0.2 之间时,突出效果适中,既能够实现视觉强调,又不会让图表显得杂乱。在实际应用中,建议单次仅突出一个核心类别,若同时突出多个类别,会分散视觉焦点,失去重点标注的意义。搭配shadow参数开启阴影效果,能够进一步增强突出扇区的立体感与层次感,强化视觉对比效果。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 全局配置
plt.rcParams.update({
    'font.sans-serif': ['SimHei', 'Arial Unicode MS'],
    'axes.unicode_minus': False,
    'figure.figsize': (8, 8)
})

# 产品销量数据定义
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales = [156, 128, 95, 78, 62]
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd']

# 核心类别突出配置,仅突出产品A
explode = [0.1, 0, 0, 0, 0]

# 带突出效果的饼图绘制
fig, ax = plt.subplots()
wedges, texts, autotexts = ax.pie(
    x=sales,
    labels=products,
    colors=colors,
    autopct='%1.1f%%',
    startangle=90,
    counterclock=False,
    explode=explode,
    shadow=True,
    wedgeprops={'edgecolor': 'black', 'linewidth': 1}
)

# 文本样式优化
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
for text in texts:
    text.set_fontsize(12)

ax.set_title('2024年各产品销量占比(核心产品突出)', fontsize=16, fontweight='bold', pad=20)
plt.show()

在学术与商业场景中,突出扇区饼图的应用有明确的规范。核心突出的类别,必须与文章或汇报的核心结论保持一致,避免无意义的视觉突出。同时,扇区的突出距离、阴影效果的强度,都要遵循适度原则,在保证视觉强调的同时,维护图表整体的美观性与专业性。wedgeprops参数依旧承担扇区边框的配置工作,保证图表样式的统一规范。

四、多子图饼图:多维度占比对比分析

单一维度的占比分析往往无法满足复杂的研究与业务需求,在对比不同时期、不同区域、不同群体的占比结构时,多子图饼图是高效的解决方案。通过在同一画布中布局多个饼图或环形图,能够实现多维度数据的同屏对比,让阅读者直观发现不同场景下的数据构成差异。

多子图可视化的核心,是保证对比维度的一致性。首先要统一不同子图的类别标签,确保对比的是完全相同的分析对象。其次要沿用统一的配色方案,让同一类别在不同子图中拥有相同的视觉标识,避免因配色混乱导致的解读错误。在代码实现中,通过plt.subplots()函数创建指定行列数量的子图,分别为每个子图绑定对应维度的数据,同时保持参数配置、样式优化的逻辑一致。通过fig.suptitle()添加全局标题,明确对比的主题,再借助plt.tight_layout()函数调整子图间距,避免标签、标题之间的重叠问题。

复制代码
import matplotlib.pyplot as plt
import numpy as np

# 全局可视化配置
plt.rcParams.update({
    'font.sans-serif': ['SimHei', 'Arial Unicode MS'],
    'axes.unicode_minus': False,
    'figure.figsize': (14, 7)
})

# 多维度对比数据:Q1与Q2季度渠道营收
channels = ['线上电商', '线下门店', '社交推广', '分销代理']
q1_revenue = [280, 160, 180, 100]
q2_revenue = [350, 190, 220, 130]
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728']

# 创建1行2列的子图布局
fig, (ax1, ax2) = plt.subplots(1, 2)

# Q1季度占比子图绘制
wedges1, texts1, autotexts1 = ax1.pie(
    x=q1_revenue, labels=channels, colors=colors,
    autopct='%1.1f%%', startangle=90, counterclock=False,
    wedgeprops={'edgecolor': 'black', 'linewidth': 1}
)
for autotext in autotexts1:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
ax1.set_title('Q1季度渠道营收占比', fontsize=14, fontweight='bold', pad=20)

# Q2季度占比子图绘制
wedges2, texts2, autotexts2 = ax2.pie(
    x=q2_revenue, labels=channels, colors=colors,
    autopct='%1.1f%%', startangle=90, counterclock=False,
    wedgeprops={
        'width': 0.3,
        'edgecolor': 'black',
        'linewidth': 1
    }
)
for autotext in autotexts2:
    autotext.set_color('white')
    autotext.set_fontweight('bold')
ax2.set_title('Q2季度渠道营收占比', fontsize=14, fontweight='bold', pad=20)

# 全局标题与布局优化
fig.suptitle('2024年Q1-Q2季度销售渠道营收占比对比', fontsize=18, fontweight='bold', y=0.98)
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()

多子图饼图的设计,要兼顾信息密度与可读性。子图的数量不宜过多,2-4 个子图是理想的范围,过多的子图会导致单图尺寸过小,细节信息无法清晰展示。在排版时,要合理设置画布尺寸,根据子图的行列数量调整figure.figsize参数。同时,文本样式、边框样式等细节要保持全局统一,让整个图表组形成完整的视觉体系,符合学术博文与正式汇报的排版规范。

五、饼图与环形图的应用规范与实践要点

饼图与环形图作为经典的占比可视化工具,有明确的适用场景与使用规范,遵循这些规范是保证分析结果准确、图表专业的关键。从数据类型来看,这类图表仅适用于非负数值的占比分析,无法处理包含负值的数据,存在负值的场景应优先选择柱状图等其他图表类型。从类别数量来看,建议将可视化的类别数量控制在 6 类以内,过多的类别会导致扇区过于细碎,不仅难以直观区分占比差异,还会出现标签重叠、文本显示不全的问题。

在视觉设计与代码实践中,有诸多细节需要重点关注。字符显示问题是跨环境运行的常见问题,通过代码开头的全局配置,提前设置中文字体与负号显示参数,能够有效避免 Windows、Mac、Linux 不同系统下的乱码问题。占比文本的可读性直接影响图表的使用效果,将占比文本设置为白色粗体,能够适配绝大多数配色方案,避免文本与扇区颜色融合导致无法辨识。配色方案的选择要兼顾视觉效果与普适性,选用色盲友好的高对比度配色,能够让图表适配更多阅读人群,体现分析工作的严谨性。

在代码编写层面,ax.pie()函数的参数调用有严格的规范。扇区的边框颜色、边框宽度、环形宽度等样式属性,必须通过wedgeprops字典进行封装传入,这是 Matplotlib 框架的底层设计逻辑。遵循这一规范,能够避免参数调用报错,保证代码在 Jupyter Notebook 等环境中稳定运行。同时,代码的编写要遵循模块化、规范化的原则,全局配置、数据准备、图表绘制、样式优化的逻辑清晰分离,便于后续的维护与修改。

六、总结

饼图与环形图是占比类数据可视化的核心工具,二者依托ax.pie()函数实现,在基础逻辑上高度统一,又能通过参数调整适配不同的分析场景。基础饼图适合简单的占比展示,环形图在视觉效果与信息密度上更具优势,突出扇区饼图能够实现核心类别的重点标注,多子图饼图则满足了多维度对比的复杂需求。

在正式的学术博文与商业汇报中,图表的专业性、可读性、规范性是核心衡量标准。从数据筛选、参数配置、样式优化到排版设计,每一个环节都要遵循行业规范与工具的设计逻辑。合理选择图表类型,严格把控代码规范,注重视觉设计的细节,才能让饼图与环形图真正发挥数据可视化的价值,高效传递数据背后的核心结论。后续将继续围绕数据分布类可视化场景,详解直方图与箱线图的实战应用,构建完整的 Matplotlib 可视化知识体系。

相关推荐
idwangzhen5 小时前
GEO优化系统哪家更专业
python·信息可视化
qq_12498707535 小时前
基于springboot的会议室预订系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·信息可视化·毕业设计·计算机毕业设计
还在忙碌的吴小二9 小时前
Go-View 数据可视化大屏使用手册
开发语言·后端·信息可视化·golang
安科瑞小许12 小时前
能碳管理平台:园区绿色转型的“智慧中枢”
大数据·人工智能·信息可视化·能源·双碳·光伏·零碳园区
那个村的李富贵1 天前
用MySQL玩转数据可视化
mysql·信息可视化·echarts
OpsEye1 天前
监控 100 问(五):监控数据的分析与可视化
运维·网络·信息可视化·it·监控·监控系统
子春一1 天前
Flutter for OpenHarmony:构建一个智能 BMI 计算器:深入解析 Flutter 中的实时计算、状态反馈与健康数据可视化
flutter·信息可视化
m0_748229992 天前
MySQL数据可视化实战指南
信息可视化
idwangzhen2 天前
2026郑州GEO优化哪个平台靠谱
python·信息可视化