我的知识记录

Python pyecharts生成饼图:环形图玫瑰图交互式

用Python pyecharts生成交互式饼图,支持环形图、南丁格尔玫瑰图、悬停显示百分比、点击图例筛选,输出HTML网页直接打开。

场景痛点

做收入构成、成本占比、客户来源分析时,饼图是标配。matplotlib画的饼图是静态图,想看某一块的精确占比得自己算。pyecharts的饼图支持鼠标悬停显示数值、点击某块分离、切换环形/玫瑰图样式,交互体验远好于静态图。这篇把三种常用饼图样式一次写全。

用到的库

pip install pyecharts

完整代码

# 导入 pyecharts 饼图和配置
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.commons.utils import JsCode


def draw_pie():
# 各渠道收入占比
data = [
("直销", 420),
("线上电商", 350),
("代理商", 280),
("线下门店", 180),
("其他", 90),
]

pie = (
Pie()
.add(
series_name="收入来源",
data_pair=data,
# 环形图:内径30%,外径60%;改成 ["0%", "60%"] 就是实心饼图
radius=["30%", "60%"],
# 南丁格尔玫瑰图:花瓣按数值大小放射排列
# rose_type="radius",
center=["50%", "55%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="年度收入渠道占比", subtitle="单位:万元"),
legend_opts=opts.LegendOpts(orient="vertical", pos_left="5%", pos_top="20%"),
toolbox_opts=opts.ToolboxOpts(),
)
.set_series_opts(
# 标签显示名称和百分比
label_opts=opts.LabelOpts(
formatter="{b}: {d}%"
),
# 鼠标悬停时该块稍微分离
emphasis_opts=opts.EmphasisOpts(
scale=True,
scale_size=10,
),
)
)

pie.render("pyecharts_pie.html")
print("pyecharts饼图已保存为 pyecharts_pie.html")


if __name__ == "__main__":
draw_pie()

代码讲解

  • Pie().add() 接收 data_pair 列表,每个元素是 (名称, 数值) 的元组,pyecharts自动算占比。
  • radius=["30%", "60%"] 关键参数:内径30%、外径60%,中间镂空就是环形图;改成 ["0%", "60%"] 就是传统实心饼图。
  • rose_type="radius"(代码里注释掉了)切换成南丁格尔玫瑰图,每块花瓣的角度和半径都按数值大小变化,视觉上更突出差异。
  • formatter="{b}: {d}%" 标签模板,{b} 是名称,{d} 是百分比,悬停tooltip里也能看到。
  • EmphasisOpts(scale=True) 鼠标移到某块上时,那块会轻微放大分离,突出显示当前选中项。
  • orient="vertical" 把图例竖排放到左侧,比横排更省空间。

运行结果

当前目录生成 pyecharts_pie.html,浏览器打开后是一个环形饼图,每块显示渠道名和百分比,鼠标悬停某块会放大并显示详情。点击左侧图例可以隐藏某一块的占比,右上角工具栏可以下载PNG。

注意事项

  • 分类超过8块时饼图会很碎,建议把占比小于3%的合并成"其他"。
  • 环形图比实心饼图更现代,中间的空白位置还可以放总数值文字。
  • pyecharts的百分比是自动计算的,不用自己除总数,但要确认传入的数值都是正数。
  • 如果想要纯静态图片,pyecharts不直接导出PNG,可以用截图或者结合snapshot-selenium库导出。

Python pyecharts生成饼图:环形图玫瑰图交互式

标签:

更新时间:2026-09-14 20:26:53

上一篇:Python 计算文件 MD5/SHA256 校验值 批量对比教程

下一篇:Python pyecharts生成折线图HTML:可交互的趋势图