Python结合Matplotlib绘制支持局部高亮的饼图

月亮慢半拍
月亮慢半拍
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍如何利用 Python 的 Matplotlib 结合 Seaborn 快速生成支持局部高亮的饼图。通过配置 explode 参数可精确控制目标扇区的偏移距离,配合预设调色板与尺寸缩放,轻松实现数据占比的视觉突出,适用于报告展示与数据分析场景。

饼图高亮显示的原理与核心参数

饼图通过圆形扇区的弧长与面积直观反映各部分在整体中的比例关系。当需要强化某一类别的数据关注度时,传统做法需计算复杂坐标,而 Matplotlib 提供了更直接的交互手段。高亮效果依赖于 plt.pie() 函数的 explode 参数,该参数接收一个与数据维度一致的列表,数值代表对应扇区沿径向向外平移的距离。默认状态下所有元素为 0,保持紧贴圆心;仅需将目标位置的数值调整为正数(例如 0.05 或 0.1),即可实现无脑式的高亮分离。

使用highlight_idx=0生成的高亮饼图结果
演示单个切片偏移高亮的实际渲染效果

完整绘图函数实现

为提升复用性并减少重复代码,建议将绘图逻辑封装为独立函数。以下实现内置了输入校验、防越界处理、自动配色与导出功能,可直接集成至现有数据报表 pipeline 中。

import matplotlib.pyplot as plt
import seaborn as sns

def draw_pie_chart(
    val_list, label_list, highlight_idx=-1,
    title="", xlabel="", ylabel="", figsize=(8, 8), font_scale=1.2,
    is_show=False, save_name="",
    **plot_kwargs,
):
    """
    绘制带高亮切片的饼图
    :param val_list: 待处理数据列表
    :param label_list: 对应的文本标签
    :param highlight_idx: 高亮区域索引(-1表示不高亮)
    :param title: 图表标题
    :param xlabel: X 轴标签
    :param ylabel: Y 轴标签
    :param figsize: 图像尺寸 (宽, 高)
    :param font_scale: Seaborn 全局字体缩放比例
    :param is_show: 是否弹出窗口显示
    :param save_name: 存储路径(需以 .png 或 .jpg 结尾)
    :param plot_kwargs: 传递给 plt.pie 的额外参数
    :return: matplotlib Figure 对象
    """
    # 基础断言校验
    assert len(val_list) == len(label_list), "数据与标签数量必须一致"
    assert -1 <= highlight_idx < len(val_list), "高亮索引超出有效范围"

    # 初始化背景风格与画布
    sns.set(font_scale=font_scale)
    plt.figure(figsize=figsize)
    
    # 构建偏移量列表
    explode_list = [0.0] * len(val_list)
    if highlight_idx >= 0:
        explode_list[highlight_idx] = 0.05

    # 绘制饼图主体
    plt.pie(
        x=val_list,
        labels=label_list,
        autopct='%1.2f%%',
        colors=sns.color_palette('Set2'),
        explode=explode_list,
        **plot_kwargs,
    )

    # 添加文本标注
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)

    # 可选:保存图片
    if save_name:
        assert save_name.lower().endswith("png") or save_name.lower().endswith("jpg")
        plt.savefig(save_name, bbox_inches='tight', format='png')
    
    if is_show:
        plt.show()

    return plt.gcf()

快速调用与执行步骤

第1步:准备数据与定义标签列表

构造等长的数值列表 val_list 与字符串列表 label_list。确保数据类型支持求和运算,标签需具有清晰的业务含义。例如展示模型组件占比时:


data_list = [11, 11, 7, 26]
label_list = ["MSA Update", "Model Diversity", "MSA Ranking", "Unified Prediction"]

第2步:实例化函数并指定高亮索引

调用封装好的 draw_pie_chart。若希望高亮第一个分类,将 highlight_idx 设为 0。函数内部会自动将其映射至 explode_list 对应位置,其他位置保持 0.0。此设计避免了手动维护长列表偏移量的繁琐操作。

第3步:执行渲染或导出图片

通过布尔参数 is_show=True 触发 GUI 窗口预览;若需归档,传入 save_name="output.png"。函数执行后会返回当前 Figure 对象,便于进一步叠加注解或子图排版。注意 sns.set() 会作用于当前会话的全局样式,若在同一环境绘制多类图表,建议使用独立的 rcParams 隔离设置。

关键注意事项

  • 依赖安装:脚本强依赖 matplotlib 与 seaborn,未安装时将抛出 ModuleNotFoundError。
  • 索引安全:函数已内置边界拦截,传入负数或越界正数会被限制在有效范围内,但会记录日志警告(取决于具体运行环境配置)。
  • 导出格式:保存逻辑强制检查文件后缀,推荐统一使用 .png 以保证透明背景与抗锯齿质量。
  • 性能优化:当切片数量超过 20 时,百分比文字可能重叠。此时建议增大 figsize 或改用环形图(wedgeprops={'width': 0.3})提升可读性。

以上就是使用Python与Matplotlib绘制带高亮切片饼图的详细内容,更多关于Python数据可视化与自定义图表的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表