欢迎来到pyecharts饼图系列教程的进阶篇!在上一篇基础教程中,我们学习了饼图的基本概念和简单实现。在本文中,我们将深入探索pyecharts中饼图的六种高级用法和自定义选项,包括环形饼图、富文本标签饼图、滚动图例饼图、环形图、嵌套饼图和多饼图组合。这些技巧将帮助你创建更加专业、美观且信息丰富的数据可视化图表。pyecahts源码
下面是本文将要介绍的饼图类型概览:
- 环形饼图:基础环形设计,适合展示分类占比
- 富文本标签饼图:自定义标签样式,提升信息展示效果
- 滚动图例饼图:解决多类别数据图例过长问题
- 环形图(Doughnut_chart):中间留白的环形设计,适合对比数据
- 嵌套饼图(Nested_pies):多层级数据结构展示
- 多饼图(Multiple_pie):多图表对比分析
让我们从环形饼图开始学习。
目录
环形饼图(Pie - Customized_pie)
环形饼图是饼图的基础变体,通过设置内半径不为零创建环形效果,使图表更加直观和美观。下面是一个展示不同访问来源数据的环形饼图实现代码:
import pyecharts.options as opts
from pyecharts.charts import Pie
"""
Gallery 使用 pyecharts 1.1.0
参考地址: `https://echarts.apache.org/examples/editor.html?c=pie-doughnut`
目前无法实现的功能:
1、迷之颜色映射的问题
"""
# 定义数据
x_data = ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"]
y_data = [335, 310, 274, 235, 400]
# 组合数据并按值排序
data_pair = [list(z) for z in zip(x_data, y_data)]
data_pair.sort(key=lambda x: x[1])
# 创建饼图实例
( Pie(init_opts=opts.InitOpts(bg_color="#2c343c")) # 设置背景颜色为深色
.add(
series_name="访问来源", # 系列名称
data_pair=data_pair, # 数据对
rosetype="radius", # 设置为环形图
radius="55%", # 饼图半径
center=["50%", "50%"], # 饼图中心位置
label_opts=opts.LabelOpts(is_show=False, position="center"), # 不显示中心标签
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="Customized Pie", # 图表标题
pos_left="center", # 标题位置
pos_top="20", # 标题距离顶部的距离
title_textstyle_opts=opts.TextStyleOpts(color="#fff"), # 标题颜色
),
legend_opts=opts.LegendOpts(is_show=False), # 不显示图例
)
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" # 提示框格式
),
label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.3)"), # 标签颜色
)
#.render("customized_pie.html") # 渲染为HTML文件
.render_notebook() # 在Notebook中显示
)
代码解析
环形饼图的实现主要包含以下步骤:
数据准备:定义访问来源名称(
x_data
)和对应数据值(y_data
),组合成数据对并按值排序,使饼图扇区按大小顺序排列,提升可读性。饼图初始化:通过
Pie(init_opts=opts.InitOpts(bg_color="#2c343c"))
创建实例并设置深色背景,增强图表视觉效果。添加数据系列:使用
.add()
方法添加数据,关键参数rosetype="radius"
启用环形效果,radius="55%"
控制环形大小,center=["50%", "50%"]
设置饼图在画布中心位置。全局配置:通过
set_global_opts()
设置标题样式和位置,隐藏图例以简化界面。系列配置:使用
set_series_opts()
自定义提示框格式和标签样式,提示框会显示系列名称、数据名称、数值和百分比。渲染输出:提供两种输出方式,
render()
生成HTML文件,render_notebook()
适合在Jupyter环境中直接展示。
效果与应用
核心优势:环形设计比普通饼图更直观,能够更好地展示各分类间的比例关系。深色背景增强了数据的可读性,使图表在投影演示、报告和网页中都能清晰显示。
适用场景:
- 网站流量来源分析
- 销售渠道占比统计
- 市场份额分布展示
- 资源分配可视化
使用技巧:当数据类别较少(5-8个)且需要突出比例关系时,环形饼图是理想选择。如需强调某个类别,可考虑调整其颜色或添加动画效果。
接下来,我们将学习如何创建带有富文本标签的饼图,通过自定义标签样式提升数据展示效果。
富文本标签饼图(Pie - Rich Text Label)
富文本标签是提升饼图信息展示效果的重要手段,通过自定义标签样式、背景和格式,可以使数据标签更加直观、美观且信息丰富。下面是一个使用富文本标签的饼图示例:
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
c = (
Pie()
.add(
"",
[list(z) for z in zip(Faker.choose(), Faker.values())],
radius=["40%", "55%"],
label_opts=opts.LabelOpts(
position="outside",
formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999", "lineHeight": 22, "align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-富文本示例"))
#.render("pie_rich_label.html")
)
c.render_notebook()
代码解析
富文本标签饼图的核心在于label_opts
配置:
标签格式定义:通过
formatter
参数设置标签模板:{a|{a}}{abg|} {hr|} {b|{b}: }{c} {per|{d}%}
,其中{a}
表示系列名称,{b}
表示数据名称,{c}
表示数据值,{d}
表示百分比。样式类定义:
rich
参数是一个字典,定义了模板中各部分的样式:a
:系列名称样式(灰色、居中对齐)abg
:标签背景样式(浅灰色、圆角)hr
:分隔线样式(细灰色线)b
:数据名称样式(大字体)per
:百分比样式(深色背景、白色文字)
标签位置:设置
position="outside"
将标签显示在饼图外部,避免遮挡数据。数据生成:使用
Faker
类快速生成模拟数据,简化示例代码。
效果与应用
核心优势:富文本标签大大提升了数据标签的可读性和美观度,使标签不仅是数据展示工具,还能成为图表的视觉元素之一。
适用场景:
- 需要展示详细数据信息的报告
- 面向客户的演示文稿
- 数据看板和仪表盘
- 学术论文中的数据可视化
使用技巧:根据实际需求调整标签样式,确保文字与背景对比度足够,避免标签过于复杂影响可读性。对于数据密集型图表,富文本标签可以帮助用户快速获取关键信息。
接下来,我们将学习如何创建带有滚动图例的饼图,解决数据类别较多时的图例过长问题。
滚动图例饼图(Pie - Scroll Legend)
当饼图数据类别较多(10个以上)时,传统图例会占据大量空间,影响整体布局。滚动图例通过垂直滚动方式展示所有类别,既节省空间又保持了数据的完整性。下面是一个带有滚动图例的饼图示例:
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
c = (
Pie()
.add(
"",
[
list(z)
for z in zip(
Faker.choose() + Faker.choose() + Faker.choose(),
Faker.values() + Faker.values() + Faker.values(),
)
],
center=["40%", "50%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Pie-Legend 滚动"),
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#.render("pie_scroll_legend.html")
)
c.render_notebook()
代码解析
滚动图例饼图的实现重点在于图例配置:
数据准备:通过多次调用
Faker.choose()
和Faker.values()
生成大量模拟数据,模拟类别较多的场景。滚动图例设置:核心参数
legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical")
:type_="scroll"
:启用图例滚动功能pos_left="80%"
:将图例放置在右侧orient="vertical"
:设置图例为垂直方向
饼图位置调整:通过
center=["40%", "50%"]
将饼图向左移动,为右侧滚动图例留出足够空间。标签简化:设置标签格式为
{b}: {c}
,只显示数据名称和数值,避免标签过于复杂。
效果与应用
核心优势:在不牺牲数据完整性的前提下,有效解决了多类别数据图例过长的问题,保持了图表的简洁性和可用性。
适用场景:
- 产品分类数据展示
- 地区分布统计
- 多品牌市场份额分析
- 细分市场调研数据
使用技巧:当数据类别超过10个时,建议使用滚动图例。同时,调整饼图位置和大小,确保与图例之间有足够的空间,避免视觉冲突。
接下来,我们将学习另一种风格的环形图(Doughnut_chart),其特点是中间留有较大空白,可用于展示额外信息。
环形图(Doughnut_chart)
环形图是饼图的经典变体,通过在中间留出较大空白区域,不仅可以减轻视觉负担,还能在空白处展示标题或关键指标。这种设计特别适合对比数据或展示占比关系。下面是一个环形图的实现示例:
import pyecharts.options as opts
from pyecharts.charts import Pie
"""
Gallery 使用 pyecharts 1.1.0
参考地址: `https://echarts.apache.org/examples/editor.html?c=pie-doughnut`
目前无法实现的功能:
1、饼状图中间的图例名称暂时无法显示
"""
# 定义数据
x_data = ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"]
y_data = [335, 310, 234, 135, 1548]
# 创建饼图实例
(
Pie()
.add(
series_name="访问来源",
data_pair=[list(z) for z in zip(x_data, y_data)],
radius=["50%", "70%"],
label_opts=opts.LabelOpts(is_show=False, position="center"),
)
.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"))
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
),
# label_opts=opts.LabelOpts(formatter="{b}: {c}")
)
#.render("doughnut_chart.html")
.render_notebook()
)
代码解析
环形图的实现要点如下:
环形效果配置:通过
radius=["50%", "70%"]
设置内外半径,创建环形效果。内圆半径越大,中间空白区域越大。图例位置优化:将图例放置在左侧并设置为垂直方向(
pos_left="left", orient="vertical"
),便于用户查看类别信息。中心标签处理:当前版本中,环形图中间的图例名称暂时无法显示(代码中已注释说明),这是一个已知限制。
数据特点适配:示例中搜索引擎数据值(1548)远大于其他类别,环形图能够清晰展示这种占比悬殊的数据,突出主要类别。
效果与应用
核心优势:环形设计比普通饼图更适合展示占比关系,尤其是当存在一个主导类别时。中间的空白区域可以用于放置标题或关键指标(未来版本可能支持)。
适用场景:
- 业务报告中的核心指标展示
- 市场分析中的主导产品/服务占比
- 网站流量主要来源展示
- 资源分配中的主要方向突出
使用技巧:当需要突出某个主要类别时,环形图比普通饼图效果更好。可以通过调整内外半径比例,控制中间空白区域的大小。
接下来,我们将学习如何创建嵌套饼图(Nested_pies),它能够展示多层级的数据结构关系。
嵌套饼图(Nested_pies)
嵌套饼图是一种高级数据可视化工具,由多个同心圆环组成,能够直观展示多层级的数据结构关系,如大类与子类的包含关系。下面是一个嵌套饼图的实现示例:
import pyecharts.options as opts
from pyecharts.charts import Pie
"""
Gallery 使用 pyecharts 1.1.0
参考地址: `https://echarts.apache.org/examples/editor.html?c=pie-nest`
目前无法实现的功能:
1、暂无
"""
inner_x_data = ["直达", "营销广告", "搜索引擎"]
inner_y_data = [335, 679, 1548]
inner_data_pair = [list(z) for z in zip(inner_x_data, inner_y_data)]
outer_x_data = ["直达", "营销广告", "搜索引擎", "邮件营销", "联盟广告", "视频广告", "百度", "谷歌", "必应", "其他"]
outer_y_data = [335, 310, 234, 135, 1048, 251, 147, 102]
outer_data_pair = [list(z) for z in zip(outer_x_data, outer_y_data)]
(
Pie()
.add(
series_name="访问来源",
data_pair=inner_data_pair,
radius=[0, "30%"],
label_opts=opts.LabelOpts(position="inner"),
)
.add(
series_name="访问来源",
radius=["40%", "55%"],
data_pair=outer_data_pair,
label_opts=opts.LabelOpts(
position="outside",
formatter="{a|{a}}{abg|}
{hr|}
{b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999", "lineHeight": 22, "align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),
)
.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"))
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
)
)
#.render("nested_pies.html")
.render_notebook()
)
代码解析
嵌套饼图的实现需要处理多层数据和圆环配置:
多层数据准备:定义内层数据(
inner_data_pair
)展示主要分类(直达、营销广告、搜索引擎),外层数据(outer_data_pair
)展示更详细的子分类(如搜索引擎细分为百度、谷歌等)。同心圆环配置:通过设置不同的
radius
值创建多层圆环:- 内层圆环:
radius=[0, "30%"]
(实心内圆) - 外层圆环:
radius=["40%", "55%"]
(环形)
- 内层圆环:
标签策略:内层标签设置为
position="inner"
显示在圆环内部;外层标签设置为position="outside"
并使用富文本格式,确保信息清晰易读。图例配置:将图例放置在左侧并设置为垂直方向,便于用户理解多层数据关系。
效果与应用
核心优势:嵌套饼图能够在一个图表中同时展示多层级数据关系,帮助用户理解数据的结构和层次,以及各层级之间的占比关系。
适用场景:
- 网站流量来源的大类与子类分析
- 销售数据的地区与产品分类展示
- 市场份额的品牌与产品线关系
- 人口统计的层级结构数据
使用技巧:嵌套饼图最适合展示2-3层数据结构。层数过多会导致图表过于复杂,影响可读性。确保内层和外层数据之间有明确的包含关系。
最后,我们将学习如何创建多饼图(Multiple_pie),它可以在一个画布中展示多个独立饼图,便于对比不同类别的数据。
多饼图基本示例(Multiple_pie)
多饼图是一种强大的对比分析工具,通过在同一画布中展示多个独立饼图,可以直观对比不同类别或组的数据分布。下面是一个多饼图的实现示例:
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.commons.utils import JsCode
fn = """
function(params) {
if(params.name == '其他')
return '\\n\\n\\n' + params.name + ' : ' + params.value + '%';
return params.name + ' : ' + params.value + '%';
}
"""
def new_label_opts():
return opts.LabelOpts(formatter=JsCode(fn), position="center")
c = (
Pie()
.add(
"",
[list(z) for z in zip(["剧情", "其他"], [25, 75])],
center=["20%", "30%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["奇幻", "其他"], [24, 76])],
center=["55%", "30%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["爱情", "其他"], [14, 86])],
center=["20%", "70%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.add(
"",
[list(z) for z in zip(["惊悚", "其他"], [11, 89])],
center=["55%", "70%"],
radius=[60, 80],
label_opts=new_label_opts(),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Pie-多饼图基本示例"),
legend_opts=opts.LegendOpts(
type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
),
)
# .render("mutiple_pie.html")
)
c.render_notebook()
代码解析
多饼图的实现需要处理多个饼图的添加和布局:
自定义标签函数:使用
JsCode
定义JavaScript函数fn
,实现标签的动态格式化。当数据名称为’其他’时,添加额外换行符避免标签拥挤。标签配置封装:通过
new_label_opts()
函数封装标签配置,提高代码复用性。多饼图添加:通过四次调用
.add()
方法添加四个独立饼图,分别展示剧情、奇幻、爱情、惊悚四类数据的分布。饼图布局控制:通过
center
参数精确设置每个饼图的中心位置(如["20%", "30%"]
),使四个饼图分布在画布的四个象限。饼图大小统一:使用相同的
radius=[60, 80]
设置每个饼图的内外半径,确保视觉一致性。滚动图例支持:设置滚动图例,解决多类别数据的图例展示问题。
效果与应用
核心优势:多饼图能够在同一画布中展示多个数据分布,便于直接对比不同组或类别的数据特征,发现它们之间的差异和相似性。
适用场景:
- 不同电影类型的观众占比对比
- 各地区销售数据的分布比较
- 不同时间段的用户行为分析
- 多产品/服务的市场份额对比
使用技巧:保持各个饼图的样式一致(如颜色、大小),便于观众进行对比。饼图数量不宜过多(建议不超过4-6个),避免图表过于拥挤。
总结与展望
在本文中,我们学习了pyecharts中六种饼图的高级用法:
- 环形饼图:基础环形设计,适合展示分类占比
- 富文本标签饼图:自定义标签样式,提升信息展示效果
- 滚动图例饼图:解决多类别数据图例过长问题
- 环形图(Doughnut_chart):中间留白的环形设计,适合对比数据
- 嵌套饼图(Nested_pies):多层级数据结构展示
- 多饼图(Multiple_pie):多图表对比分析
这些技巧涵盖了饼图的主要高级应用场景,能够帮助你创建更加专业、美观且信息丰富的数据可视化图表。
在后续的文章中,我们将继续探索pyecharts
如果你有任何问题或建议,欢迎在评论区留言讨论。