Python使用Pyecharts绘制交互式饼状图教程

苏见山
苏见山
发布时间:2026-10-10| 4人浏览过
原创

在 Python 数据可视化工作流中,生成兼具美观性与动态交互能力的网页端图表,Pyecharts 是非常高效可靠的工具。通过将底层 Apache ECharts 图表引擎封装为原生 Python API,开发者可以在无需手动编写 JavaScript 的前提下,快速生成支持鼠标悬停浮窗(Tooltip)、图例动态筛选(Legend)以及平滑入场动画的独立 HTML 图表。本文围绕“绘制交互式饼状图”这一核心目标,完整介绍使用 Pyecharts 构建交互式饼状图的核心路径,涵盖环境准备、二元组键值对格式化、基础饼图链式装配、环形图与南丁格尔玫瑰图形态扩展,以及生产环境下的标签定制与常见排错方法。

一、制作流程总览与步骤规划

构建一个完整的 Pyecharts 交互式饼状图,通常遵循清晰的四步工程路径:从依赖准备开始,经由数据结构标准化清洗,再到基于图表实例的链式配置,最后导出为独立的交互式 HTML 页面并在浏览器中检验功能。

Python使用Pyecharts绘制交互式饼状图教程
图 1:Pyecharts 交互式饼图构建流程步骤图

二、开发环境准备与核心数据契约

Pyecharts 官方推荐使用 pip 进行安装。在终端或控制台中执行如下命令安装主流版本:

# 推荐在虚拟环境中执行安装
pip install pyecharts

完成安装后,在 Python 脚本中引入核心对象。绘制饼图所需的核心类主要包括用于创建图表对象的 Pie,以及用于配置全局参数与系列样式的 options 模块(通常简写为 opts):

from pyecharts.charts import Pie
from pyecharts import options as opts

使用 Pyecharts 绘制饼状图时,初学者最容易产生困惑的是数据输入规范。与其他某些基于平行列表(例如一个 x 轴列表加一个 y 轴列表)的图表不同,饼图表达的是部分与整体的关系,其底层严格要求数据输入为二元元组或列表构成的序列:每个元素均为 [类目名称, 对应数值] 的形式。

如果手头已有两个平行的类别和数值列表,最标准且地道的 Python 组装方式是使用内置函数 zip() 进行打包转换:

# 原始数据源
categories = ["线上电商", "品牌专柜", "自营门店", "渠道分销", "社交电商"]
sales_values = [320, 210, 150, 180, 90]

# 将平行列表转换为 Pyecharts 饼图认可的二元列表序列
data_pair = [list(z) for z in zip(categories, sales_values)]

# 输出的数据结构示例:
# [['线上电商', 320], ['品牌专柜', 210], ['自营门店', 150], ['渠道分销', 180], ['社交电商', 90]]
数据契约重点提醒

1. 数据对中的数值字段必须是 Python 的整型(int)或浮点型(float)。如果从 CSV 文件或数据库读入的数字带有引号为字符串类型(如 "320"),必须先显式使用 int() 或 float() 转换,否则 ECharts 无法计算各分项占比,导致图表扇区均分或渲染异常。

2. 类目名称中避免出现重复值。如果有两个类目完全同名,ECharts 在前端进行图例绑定和状态管理时会将其视为同一个实体,从而造成点击图例时多个扇区同时变动的非预期现象。

三、从零构建首个基础交互式饼图

准备好符合规范的数据序列后,即可通过链式调用(Method Chaining)语法完成饼图的装配。链式调用不仅层次清晰,还能让图表构造、数据绑定与各层配置项一气呵成。

from pyecharts.charts import Pie
from pyecharts import options as opts

# 1. 准备标准二元组数据
data = [
    ["Direct", 335],
    ["Email", 310],
    ["Union Ads", 234],
    ["Video Ads", 135],
    ["Search", 548]
]

# 2. 链式创建饼图实例并配置
chart = (
    Pie(init_opts=opts.InitOpts(width="800px", height="500px"))
    .add(
        series_name="访问来源占比",
        data_pair=data,
        radius=["0%", "75%"],   # 实心饼图的标准半径范围
        center=["50%", "50%"],   # 饼图圆心在画布中的百分比坐标
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="网站用户访问来源分析",
            subtitle="季度汇总数据 (示例)",
            pos_left="center"
        ),
        legend_opts=opts.LegendOpts(
            orient="vertical",
            pos_left="left"
        ),
        tooltip_opts=opts.TooltipOpts(
            trigger="item",
            formatter="{a} <br/>{b}: {c} ({d}%)"
        )
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(formatter="{b}: {d}%")
    )
)

# 3. 渲染为本地交互式 HTML 文件
chart.render("basic_pie.html")
运行产物说明(示例)
执行上述代码后,当前工作目录下将生成一个名为 basic_pie.html 的文件。在任意现代浏览器中双击打开该文件,可以体验以下内置交互功能:
• 鼠标悬停在任意扇区上:扇区会向外略微突出放大,并弹出半透明的浮窗(Tooltip),显示系列名称、类目、绝对数值以及精确计算出的百分比。
• 点击左侧图例项:对应的扇区会淡出隐藏,剩余扇区自动平滑重新分配角度比例;再次点击则恢复显示。
Python使用Pyecharts绘制交互式饼状图教程
图 2:Pyecharts 饼图配置体系与渲染管线架构图

四、饼图形态演化:环形图与南丁格尔玫瑰图

标准实心饼图直观反映分项所占的百分比,但在实际业务报表中,为了更好地利用画布中央空间,或强化数值悬殊时的视觉对比,通常会将其变形为空心环形图或南丁格尔玫瑰图。在 Pyecharts 中,这种形态变换完全由 radius(半径)和 rosetype(玫瑰图模式)两个核心参数决定。

1. 空心环形图的参数控制

默认情况下,实心饼图的半径参数为 radius=["0%", "75%"],其中第一个值代表内圆半径,第二个值代表外圆半径。要将饼图转换为环形图,只需将内圆半径设为大于 0 的数值(例如 "40%")。内径与外径之间的差值决定了环形的粗细程度。

# 绘制优雅的空心环形图示例
donut_chart = (
    Pie()
    .add(
        series_name="业务构成",
        data_pair=data,
        radius=["40%", "70%"],  # 内径40%,外径70%,形成中空圆环
        center=["50%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="业务构成环形图", pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="bottom")
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(
            is_show=True,
            position="outside",
            formatter="{b}: {d}%"
        )
    )
)
donut_chart.render("donut_chart.html")

2. 南丁格尔玫瑰图的两种模式

南丁格尔玫瑰图(Rose Chart)通过每个扇区外延半径的绝对长度来映射数据大小,从而摆脱了单一依赖圆心角表达数值的局限。Pyecharts 提供了两种玫瑰图模式:

  • rosetype="radius":扇区的圆心角大小保持均匀或按比例,扇区半径严格按照数据数值映射;
  • rosetype="area":所有扇区的圆心角均严格相等,完全依靠扇区外扩半径和面积表达数值差异。
# 绘制南丁格尔玫瑰图示例
rose_chart = (
    Pie()
    .add(
        series_name="销售分布",
        data_pair=data,
        radius=["20%", "75%"],    # 内径留出空间,外径作为基准上限
        center=["50%", "50%"],
        rosetype="radius",        # 关键配置:启用半径模式的玫瑰图
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="销售分布玫瑰图", pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="bottom")
    )
)
rose_chart.render("rose_chart.html")
Python使用Pyecharts绘制交互式饼状图教程
图 3:基础饼图、环形图与南丁格尔玫瑰图参数对比图

五、标签排版优化与高级交互定制

在默认配置下,如果饼图的分类项较多(超过 6 个)或某些分项的数值非常微小,扇区边沿的文本标签极易发生重叠遮挡,严重影响图表可读性。Pyecharts 提供了丰富的标签和提示项配置,帮助开发者建立整洁清晰的交互界面。

1. 标签格式化器(Formatter)的占位符规范

通过在 set_series_opts(label_opts=opts.LabelOpts(formatter="...")) 中设置模板字符串,可以自由组合标签文字。ECharts 饼图预置了四个关键变量占位符:

  • {a}:系列名称(Series Name,即 .add() 时传入的第一个参数);
  • {b}:数据项名称(Category Name,即数据对中的类目键);
  • {c}:数据项绝对数值(Value);
  • {d}:该项在当前系列中所占的计算百分比(Percentage,自动保留小数位)。

例如,若希望直接在扇区外部显示“类目名: 35.5%”的形式,只需将格式化字符串设为 formatter="{b}: {d}%"。

2. 防止标签重叠与引导线微调

针对标签重叠问题,常规解决方案包括:开启外部显示模式、设置富文本分行,或结合平滑引导线。完整配置实例如下:

advanced_pie = (
    Pie()
    .add(
        series_name="渠道流量",
        data_pair=data,
        radius=["35%", "65%"],
        center=["50%", "50%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="精细化交互饼图",
            pos_left="center"
        ),
        legend_opts=opts.LegendOpts(
            orient="vertical",
            pos_left="2%",
            pos_top="15%",
            item_gap=12
        ),
        tooltip_opts=opts.TooltipOpts(
            trigger="item",
            formatter="{a} <br/>{b} : {c} ({d}%)"
        )
    )
    .set_series_opts(
        label_opts=opts.LabelOpts(
            is_show=True,
            position="outside",
            formatter="{b}: {d}%"
        ),
        tooltip_opts=opts.TooltipOpts(trigger="item")
    )
)
advanced_pie.render("advanced_pie.html")

六、常见运行报错与排错边界

在日常开发和线上批处理生成过程中,以下三类问题最常导致图表无法正常工作或显示异常:

故障现象 根本原因 排查与修复方法
导出的 HTML 文件完全空白,或者浏览器控制台报数据解析错误 传入 data_pair 的数据格式不符合二元序列契约。例如传入了单一的 Python 字典,或者两个各自独立的 List。 使用 [list(z) for z in zip(names, values)] 严格重构为二元列表序列,检查是否有非预期的空嵌套。
所有扇区大小完全相同,或者百分比均显示为 0% 数据源中的数字字段类型为字符串(如 "120"),导致 ECharts 无法执行数值求和与百分比除法。 在装配前执行显式类型转换,确保数值类型为 int 或 float。
在无外网连接的局域网或内网机器上打开 HTML 时图表空白 Pyecharts 默认通过公共 CDN(如 jsdelivr 等)在线拉取 echarts.min.js 核心脚本,断网环境下脚本加载超时失败。 在脚本开头配置 from pyecharts.globals import CurrentConfig 并指定本地静态文件路径:CurrentConfig.ONLINE_HOST = "./static/js/"。
Python使用Pyecharts绘制交互式饼状图教程
图 4:Pyecharts 交互式饼图核心要素与避坑速查图

七、总结

使用 Pyecharts 构建交互式饼图的过程,本质上是将业务数据映射为标准二元组序列,并通过清晰的链式语法配置前端表现的过程。只要掌握了 data_pair 的契约规范、radius 和 rosetype 的形态变形逻辑,以及 label_opts 的格式化语法,就能够快速制作出高质感、交互流畅的可视化报表。在实际业务中,当类目数量较多时,适度将长尾小分类归并为“其他”,并配合空心环形图进行中心留白,能够显著提升数据报表的传达效率与专业度。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。