Python使用Pyecharts绘制交互式饼状图教程
在 Python 数据可视化工作流中,生成兼具美观性与动态交互能力的网页端图表,Pyecharts 是非常高效可靠的工具。通过将底层 Apache ECharts 图表引擎封装为原生 Python API,开发者可以在无需手动编写 JavaScript 的前提下,快速生成支持鼠标悬停浮窗(Tooltip)、图例动态筛选(Legend)以及平滑入场动画的独立 HTML 图表。本文围绕“绘制交互式饼状图”这一核心目标,完整介绍使用 Pyecharts 构建交互式饼状图的核心路径,涵盖环境准备、二元组键值对格式化、基础饼图链式装配、环形图与南丁格尔玫瑰图形态扩展,以及生产环境下的标签定制与常见排错方法。
一、制作流程总览与步骤规划
构建一个完整的 Pyecharts 交互式饼状图,通常遵循清晰的四步工程路径:从依赖准备开始,经由数据结构标准化清洗,再到基于图表实例的链式配置,最后导出为独立的交互式 HTML 页面并在浏览器中检验功能。
二、开发环境准备与核心数据契约
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")
• 鼠标悬停在任意扇区上:扇区会向外略微突出放大,并弹出半透明的浮窗(Tooltip),显示系列名称、类目、绝对数值以及精确计算出的百分比。
• 点击左侧图例项:对应的扇区会淡出隐藏,剩余扇区自动平滑重新分配角度比例;再次点击则恢复显示。
四、饼图形态演化:环形图与南丁格尔玫瑰图
标准实心饼图直观反映分项所占的百分比,但在实际业务报表中,为了更好地利用画布中央空间,或强化数值悬殊时的视觉对比,通常会将其变形为空心环形图或南丁格尔玫瑰图。在 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")
五、标签排版优化与高级交互定制
在默认配置下,如果饼图的分类项较多(超过 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/"。 |
七、总结
使用 Pyecharts 构建交互式饼图的过程,本质上是将业务数据映射为标准二元组序列,并通过清晰的链式语法配置前端表现的过程。只要掌握了 data_pair 的契约规范、radius 和 rosetype 的形态变形逻辑,以及 label_opts 的格式化语法,就能够快速制作出高质感、交互流畅的可视化报表。在实际业务中,当类目数量较多时,适度将长尾小分类归并为“其他”,并配合空心环形图进行中心留白,能够显著提升数据报表的传达效率与专业度。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









