查看全课大纲(第 26 / 45 节)

饼图

饼图:展现数据构成的基础工具

小象实战讲义 · ECharts 数据可视化

在数据分析中,我们常常需要了解各个组成部分在整体中的占比情况。例如,不同产品类别的销售额占比、用户来源渠道的分布、项目预算的分配等。饼图(Pie Chart)正是为这类“成分比例”可视化需求而生的经典图表。本节我们将学习如何使用 pyecharts 绘制基础饼图及其变体——圆环图,并掌握如何通过标签配置项清晰地展示数据信息。

💡 核心导读

  • 图表定位:饼图用于展示单一维度下,不同分类数据相对于总数的占比情况,通过扇形面积直观对比。
  • 适用与禁忌:适用于无零值或负值的数据;分类不宜过多(通常不超过9个);不适用于多分类数据的直接比较。
  • 数据格式:pyecharts 饼图接收的数据格式为“列表的列表”,例如 [[‘分类A‘, 100], [‘分类B‘, 200]]。
  • 标签定制:通过 LabelOpts(formatter=‘...‘) 中的 {a}, {b}, {c}, {d} 占位符,可以灵活定义悬停和标签显示的文本内容。
  • 圆环图绘制:在饼图基础上,通过 radius 参数设置内径和外径的比例,即可轻松转换为视觉上更聚焦的圆环图。

1. 理解饼图:何时用,何时不用

饼图通过将一个圆形划分为多个扇形区块来呈现数据。整个圆形代表数据的总量,每个扇形区块的弧长(或面积)大小则对应其分类在总量中所占的比例。所有区块的比例之和为100%。

它的核心价值在于直观地展现“部分与整体”的关系。例如,在查看不同手机品牌的销量占比时,一眼就能看出哪个品牌市场份额最大。

然而,饼图也有其明确的适用边界:

  • 数据要求:数据中不应包含零值或负值,因为扇形面积无法有意义地表示这些数值。
  • 分类数量:分类不宜过多。当分类超过7-9个时,许多扇形会变得非常细小,难以辨认和比较,反而会削弱图表的可读性。此时,考虑使用百分比柱状图可能更合适。
  • 比较场景:饼图擅长展示一个数据系列内部的构成,但不适合直接比较多个不同系列之间的构成差异(例如,比较A公司和B公司各自的部门预算占比)。虽然可以并排放置多个饼图,但对比效果通常不如分组柱状图直观。

2. 绘制基础饼图

在 pyecharts 中,绘制图表遵循“准备数据 -> 创建图表对象 -> 添加数据与配置 -> 渲染”的通用流程。对于饼图,数据需要处理成特定的格式。

首先,我们引入必要的模块,并准备一份示例数据。为了避免随机性,我们这里使用硬编码数据。

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

pie_data = [
    ["小米", 140],
    ["OPPO", 28],
    ["vivo", 65],
    ["魅族", 20],
    ["三星", 95],
    ["苹果", 200],
    ["华为", 150],
]

label_formatter = "{b}: {c} ({d}%)"

# 基础饼图:默认标签
pie_chart = (
    Pie()
    .add(series_name="手机品牌", data_pair=pie_data)
    .set_global_opts(title_opts=opts.TitleOpts(title="各品牌手机销量占比"))
    .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)

# 定制标签:同时显示名称、数值和百分比
pie_chart_custom_label = (
    Pie()
    .add("手机品牌", pie_data)
    .set_global_opts(title_opts=opts.TitleOpts(title="定制标签的饼图"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter=label_formatter, is_show=True))
)

# 圆环图:用内、外半径控制空心区域和环宽
radius = ["40%", "70%"]
doughnut_chart = (
    Pie()
    .add("手机品牌", pie_data, radius=radius)
    .set_global_opts(title_opts=opts.TitleOpts(title="圆环图示例"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)

# 只需验证图表能否正常生成,不读取 options 中的嵌套配置
for chart in (pie_chart, pie_chart_custom_label, doughnut_chart):
    chart.render_embed()

print(f"图表类型: {type(pie_chart).__name__}")
print(f"包含数据分类数: {len(pie_data)}")
print(f"定制标签格式: {label_formatter}")
print(f"圆环内/外半径: {radius[0]} / {radius[1]}")
各品牌手机销量占比的圆环图,中间留空
图:圆环图:中间留空降低视觉重量,空出的中心还能补充总量说明。手机端可左右滑动查看,点击图片可看全图。
各品牌手机销量占比饼图,每个扇区标签包含品牌名与百分比
图:定制标签饼图:用 formatter 把名称、数值和百分比组合进标签,扇区含义一目了然。手机端可左右滑动查看,点击图片可看全图。
图表类型: Pie
包含数据分类数: 7
定制标签格式: {b}: {c} ({d}%)
圆环内/外半径: 40% / 70%

这段代码创建了一个基础的饼图。add() 方法中的 data_pair 参数接收的就是我们准备好的 pie_data。set_series_opts 中的 LabelOpts(is_show=True) 确保了每个扇形上会显示对应的分类名称。

运行后,你将得到一个交互式饼图。将鼠标悬停在任意扇形上,会触发高亮并显示该分类的详细信息(名称和数值)。这就是 ECharts 默认提供的交互体验。

3. 定制标签:使用 formatter 清晰表达

默认的标签显示可能不符合我们的需求,比如我们可能希望同时显示数值和百分比。这时就需要用到标签格式器 formatter。

在 pyecharts (对应 ECharts) 的饼图标签配置中,预定义了几个变量可供调用:

  • {a}:系列名称(series name),本例中是“手机品牌”。
  • {b}:数据项名称(data item name),即分类名称,如“小米”。
  • {c}:数值(value),如 140。
  • {d}:百分比(percentage),如 20.5%。

注意:{d} 是饼图、漏斗图等比例图表特有的占位符,在折线图、散点图中不可用。

让我们修改标签,使其显示“品牌:数值 (百分比%)”的格式。上面的主示例已经把该格式保存在 label_formatter 并应用到 pie_chart_custom_label,无需再拆出依赖前块变量的代码。

通过 formatter=“{b}: {c} ({d}%)“,我们指定了标签的显示模板。现在,每个扇形上会直接显示例如“小米: 140 (20.0%)”这样的信息,使得图表的信息量更加丰富和直观。formatter 支持字符串拼接,你可以根据需要自由组合这些占位符和文字。

4. 绘制圆环图

圆环图(Doughnut Chart)是饼图的一种变体,它将饼图的中心部分挖空。这种设计有时能减少视觉压力,并在中心区域留出空间,可用于放置总计数据或其他关键信息。

在 pyecharts 中,将饼图转换为圆环图非常简单,只需在 add() 方法中指定 radius 参数。

radius 参数接受一个列表,例如 [‘50%‘, ‘70%‘]:

  • 第一个值 ‘50%‘ 表示内半径,即空心部分半径占整个容器半径的比例。
  • 第二个值 ‘70%‘ 表示外半径,即整个圆环外缘半径占容器半径的比例。
  • 调整这两个值,可以控制环的粗细。当内半径为 ‘0%‘ 时,就是标准的饼图。

上面的 doughnut_chart 已经通过 radius=["40%", "70%"] 完成圆环图构建。代码先验证三个图表都能生成 HTML,再只打印稳定的类型、分类数、标签模板和半径摘要。

通过设置 radius=[“40%“, “70%“],我们得到了一个环宽为容器半径30%的圆环图。你可以尝试调整这两个百分比,观察环的粗细变化,例如 [“20%“, “50%“] 会得到一个更细的环,[“0%“, “60%“] 则相当于一个较小的饼图。

📝 动手练一练

  1. 数据准备练习:假设你有一份字典格式的销售数据 sales = {‘产品A‘: 300, ‘产品B‘: 150, ‘产品C‘: 450, ‘产品D‘: 100}。请编写代码,将其转换为 pyecharts 饼图所需的 data_pair 格式(列表的列表)。
点击查看参考答案
sales = {'产品A': 300, '产品B': 150, '产品C': 450, '产品D': 100}
# 使用列表推导式将字典转换为列表的列表
pie_data_from_dict = [[k, v] for k, v in sales.items()]
print(pie_data_from_dict)

输出:

[['产品A', 300], ['产品B', 150], ['产品C', 450], ['产品D', 100]]
  1. 标签定制练习:使用上面转换好的数据,绘制一个饼图,要求标签显示为“产品名称 (占比)”,例如“产品A (33.3%)”。(提示:只使用 {b} 和 {d} 占位符)。
点击查看参考答案
from pyecharts import options as opts
from pyecharts.charts import Pie

sales_data = [['产品A', 300], ['产品B', 150], ['产品C', 450], ['产品D', 100]]

practice_chart = (Pie()
                  .add("", sales_data)
                  .set_series_opts(
                      label_opts=opts.LabelOpts(formatter="{b} ({d}%)")
                  )
                 )
# 生成图表(在支持的环境下)
# practice_chart.render('practice_pie.html')
print("标签格式器已设置为: {b} ({d}%)")
标签格式器已设置为: {b} ({d}%)

本章小结

本节我们学习了成分比例可视化的入门图表——饼图及其变体圆环图。你掌握了如何根据数据关系选择合适的图表,理解了饼图的数据格式要求,并学会了通过 formatter 灵活配置标签,以及使用 radius 参数绘制圆环图。

📋 行动清单

  • 在本地或在线环境中,运行本节的所有代码示例,观察生成的饼图和圆环图。
  • 尝试修改 formatter 字符串,例如改为“{a}系列-{b}的销量是{c}台”,观察图表标签的变化。
  • 调整圆环图的 radius 参数,如设为 [‘30%‘, ‘80%‘] 或 [‘0%‘, ‘60%‘],直观感受内、外半径对图表形态的影响。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 07_成分比例可视化.ipynb · ECharts 课程配套资源
    IPYNB · 章级代码与输出
    下载
  • top5.csv · ECharts 课程配套资源
    课程配套文件
    下载