精通 Python Plotly 饼图:从入门到最佳实践的完全指南

在数据可视化的世界中,将复杂的数据转化为直观的洞察是一项至关重要的技能。当你需要展示部分与整体的关系时,饼图无疑是经过时间考验的经典选择。今天,我们将深入探索如何使用 Python 中最强大的交互式可视化库——Plotly Express,来创建既美观又富含信息的饼图。

在这篇文章中,我们将不仅仅是教会你从零开始构建图表,我们还会融入 2026 年最新的开发理念,探讨如何利用 AI 辅助工具加速这一过程。我们将掌握数据分组的奥秘,并探索如何通过自定义颜色和样式来提升图表的专业度。我们将通过一系列实际的代码示例,带你领略 Plotly 在数据呈现上的独特魅力,并分享我们在生产环境中的实战经验。让我们开始这段可视化之旅吧!

为什么选择 Plotly Express?

在开始编写代码之前,我们需要先了解一下我们的工具。Plotly 是一个 Python 库,主要用于设计图形,尤其是交互式图形。虽然像 Matplotlib 这样的库很棒,但 Plotly 提供了开箱即用的交互性——悬停提示、缩放和平移功能,这在现代 Web 应用和数据分析报告中非常受欢迎。

它可以绘制多种图形,例如直方图、条形图、箱线图、散点图等等。而 Plotly Express (px) 则是 Plotly 的高级封装,它的语法更加简洁,能够让我们用更少的代码完成更多的工作。

#### 什么是饼图?

饼图是一种圆形的统计图表,被划分为多个扇区来象征数值百分比。在 px.pie 中,每个扇区代表数据中特定类别的数值大小。虽然饼图看起来简单,但它们在展示“占比”这一概念时非常有效。当然,需要注意的是,当类别过多时,饼图可能会变得难以阅读,这时我们通常会考虑其他图表类型。

基础语法与核心参数解析

让我们先来看看 px.pie 的核心语法。理解这些参数是掌握灵活绘图的关键。

> 语法概览:

> plotly.express.pie(data_frame=None, names=None, values=None, color=None, color_discrete_sequence=None, color_discrete_map={}, hover_name=None, hover_data=None, custom_data=None, labels={}, title=None, template=None, width=None, height=None, opacity=None, hole=None)

虽然参数很多,但别担心,我们通常只需要关注其中的几个核心参数。让我们详细解析一下最常用的几个:

参数名称

接受值类型

描述与实战建议 :—

:—

:— dataframe

DataFrame, array-like, dict

我们的数据源。虽然它可以接受列表或字典,但在实际工作中,我们通常会传入一个 Pandas DataFrame。如果省略此参数,Plotly 会尝试根据其他参数(如 INLINECODE
a6b35dc5 或 names)在内部构建一个 DataFrame。 names

str, int, Series, array-like

这是饼图的“标签”。它定义了扇区的分类。例如,如果我们想看不同产品的销售占比,这里就是产品名称所在的列。 values

str, int, Series, array-like

这是饼图的“数值”。它决定了扇区的大小。如果没有提供此参数,Plotly 会自动计算 names 列中每个类别的出现次数(相当于计数),这对于快速查看频率分布非常有用。 color

str, int, Series, array-like

用于为不同扇区分配颜色的列。这在你想根据数据的某种属性(如“地区”或“状态”)来区分颜色时非常有用,而不仅仅是基于 namestitle

str

图表的标题。一个好的标题能让图表的意图一目了然。 hole

float

如果你喜欢环形图而不是标准的饼图,可以设置这个参数(0到1之间),例如 0.4 会在中间挖一个孔。

2026开发新范式:AI辅助绘图与代码生成

在我们深入具体的代码实现之前,我想和大家分享一个在 2026 年极其重要的工作流转变:Vibe Coding(氛围编程)与 AI 辅助开发

在我们现在的日常开发中,Cursor、Windsurf 或 GitHub Copilot 不仅仅是补全工具,它们是我们的结对编程伙伴。当我们需要创建一个复杂的 Plotly 图表时,我们不再从零开始查阅文档。相反,我们会这样与 AI 交互:

  • 场景描述:你可能会在 IDE 中写注释,“# 创建一个展示销售数据占比的环形图,使用深色主题,突出显示最大值。”
  • 代码生成:AI 会根据上下文自动生成 INLINECODE2115d16d 的代码框架,包括 INLINECODEb9e8ec7d 参数和 color_discrete_sequence 的配置。
  • 迭代优化:如果生成的图表颜色不满意,我们可以直接选中代码块,告诉 AI “把配色方案改为 Viridis”,它就会自动修改参数。

这种 Agentic AI 的工作流极大地提高了我们的效率。但作为开发者,深入理解底层原理仍然是至关重要的,这样才能在 AI 生成错误代码时,迅速定位问题并进行微调。

实战演练 1:构建你的第一个饼图

让我们从最基础的例子开始。我们将手动创建一些数据,来展示如何绘制一个简单的饼图。

在这个场景中,假设我们有三个不同的项目 A、B 和 C,我们想直观地展示它们的数值对比。

import plotly.express as px
import numpy as np

# 准备数据:这里我们使用简单的列表
# random_x 代表每个扇区的数值大小
random_x = [100, 2000, 550]

# names 代表每个扇区的标签
names = [‘项目 A‘, ‘项目 B‘, ‘项目 C‘]

# 使用 px.pie 创建图表
# values 参数设定数值,names 参数设定分类标签
fig = px.pie(values=random_x, names=names)

# 展示图表
fig.show()

运行这段代码后,你将看到:

!基础饼图示例

> 代码解读:

> 在上面的例子中,我们没有传入 INLINECODE8a69ee36,而是直接使用了 INLINECODE4fb807cd 和 names 列表。Plotly 足够智能,能够直接处理这些列表并将其转换为可视化图形。当你将鼠标悬停在扇区上时,你会看到默认的悬停信息,显示了类别名称、数值以及自动计算的百分比。

实战演练 2:数据分组与自动聚合

在现实世界的数据分析中,我们很少处理只有三行数据的列表。更多时候,我们需要处理包含成百上千行记录的数据集。这时,Plotly Express 的强大之处就体现出来了:它会自动帮我们处理数据的聚合。

让我们使用著名的鸢尾花数据集(Iris dataset)来演示这一点。这个数据集包含了150行数据,但只有3个物种。

import plotly.express as px

# 加载内置的鸢尾花数据集
# 这是一个包含150行花的测量数据的 DataFrame
df = px.data.iris()

# 快速查看数据的前几行(在控制台打印)
print("数据预览:")
print(df.head())

# 绘制饼图
# 这里的关键在于:我们将包含多个重复值的 ‘species‘ 列传给了 names
# 并将 ‘sepal_width‘(花萼宽度)传给了 values
fig = px.pie(df, values=‘sepal_width‘, names=‘species‘)

fig.show()

输出结果:

!数据分组饼图

发生了什么?

你会发现,尽管数据集中有150行,但最终的饼图只有3个扇区。这是因为 Plotly 自动将相同的 INLINECODE178a15b3(物种)归类在了一起,并将它们对应的 INLINECODEc6dadf85(花萼宽度)进行了求和。

这是一个非常重要的特性:我们不需要在绘图前手动编写 INLINECODE30f90629 和 INLINECODE12c608bf 代码,Plotly 会替我们完成这项繁琐的工作。 这让我们的数据探索流程变得更加流畅。

工程化实践:处理数据异常与边界情况

在真实的生产环境中,数据往往是不完美的。我们经常遇到缺失值或异常值。如果我们直接将包含 NaN(空值)的数据传给 Plotly,它可能会抛出错误或者生成令人困惑的图表。

我们在最近的一个金融项目中就遇到了这个问题。解决方案非常直接:数据清洗优先策略。我们习惯在绘图前通过 Pandas 的 INLINECODE7b297e78 或 INLINECODE4e0633c5 进行预处理。

# 在绘图前进行防御性编程
df_clean = df.dropna(subset=[‘values_column‘, ‘names_column‘])
# 或者填充默认值
# df_clean = df.fillna(0)

fig = px.pie(df_clean, names=‘category‘, values=‘amount‘)

这种“防御性编程”习惯结合 AI 的静态代码分析,可以显著降低线上图表崩溃的风险。

实战演练 3:自定义图表与增强交互性

一个专业的图表不仅仅是数据的堆砌,还需要清晰的标题和丰富的信息提示。Plotly 允许我们轻松地添加标题,并通过 hover_data 参数自定义鼠标悬停时显示的信息。

让我们改进上面的例子,使其更具信息量。

import plotly.express as px

df = px.data.iris()

# 创建带有自定义信息的饼图
fig = px.pie(
    df, 
    values=‘sepal_width‘, 
    names=‘species‘,
    # 设置图表的标题
    title=‘鸢尾花数据集分析:各物种花萼宽度占比‘,
    # 自定义悬停数据:除了默认的百分比和数值,我们还显示 ‘sepal_length‘
    hover_data=[‘sepal_length‘]
)

fig.show()

输出效果:

!自定义饼图

进阶技巧:

现在,当你把鼠标悬停在某个扇区上时,你不仅会看到物种名称和花萼宽度的总和,还会看到该物种的花萼长度相关信息(Plotly 会显示该列的均值或其他统计信息,取决于上下文)。这种多维度展示对于深入理解数据非常有帮助。

实战演练 4:美学控制与颜色定制

颜色是数据可视化的灵魂。默认的颜色虽然可以接受,但在制作商业报告或品牌展示时,我们通常需要符合特定主题的配色方案。

在 Plotly 模块中,我们可以通过 color_discrete_sequence 参数轻松更改颜色。

import plotly.express as px

df = px.data.iris()

# 使用 px.colors.sequential.RdBu 配色方案
# 这是一个从红到蓝的渐变色板,非常适合展示对比
fig = px.pie(
    df, 
    values=‘sepal_width‘,
    names=‘species‘, 
    # 这里我们指定了一个具体的颜色序列
    color_discrete_sequence=px.colors.sequential.RdBu
)

fig.show()

输出效果:

!定制颜色饼图

探索更多配色:

Plotly 提供了大量的内置配色方案,例如 INLINECODEfc8656e7、INLINECODE64eeae82、INLINECODEb4baf9f9 等。你可以尝试将 INLINECODEc473117a 替换为 px.colors.qualitative.Plotly,看看哪种风格更符合你的审美。通常,为了帮助用户更好地区分数据,我们会选择对比度较高的配色。

实战演练 5:进阶应用——环形图与文本模板

为了让你在项目中更具竞争力,我们再来看一个稍微高级一点的例子:环形图。环形图在现代仪表板中非常流行,因为它们看起来比普通饼图更轻盈,而且中间的空间可以用来显示总数或关键指标。

此外,我们还可以自定义扇区上显示的文本格式。

import plotly.express as px

df = px.data.iris()

# 计算总数,以便在标题中展示
total_sepal_width = df[‘sepal_width‘].sum()

# 创建环形图
# hole=0.3 表示中间挖空 30% 的半径
fig = px.pie(
    df, 
    values=‘sepal_width‘, 
    names=‘species‘,
    title=f‘花萼宽度分布 (总数: {total_sepal_width:.2f})‘,
    hole=0.3,
    # 自定义文本显示格式:显示标签和百分比,保留一位小数
    # percent 是一个特殊的关键字,代表计算出的百分比
    labels={‘species‘: ‘物种名称‘}
)

# 更新布局和文本信息
fig.update_traces(
    textinfo=‘label+percent‘, 
    textfont_size=12
)

fig.show()

在这个例子中,我们通过设置 INLINECODE4e639dd9 将饼图变成了环形图。同时,利用 INLINECODEde4e27bf 方法,我们精确控制了扇区上显示的文本内容,使其既包含类别名称也包含百分比,极大地提高了信息的可读性。

性能优化与现代部署策略

当我们谈论 2026 年的技术栈时,图表往往不仅仅是在本地 Jupyter Notebook 中运行,而是被部署为Serverless 的微服务,或者嵌入到基于 React/Vue 的前端应用中。

这里有几个我们在生产环境中总结的性能优化建议:

  • 后端聚合,前端渲染:如果你的数据量达到百万级,不要把原始数据发给 Plotly。在后端使用 Pandas 或 SQL 完成聚合计算,只传输聚合后的 JSON 数据给前端。
  • 使用 Plotly JSON 编码:在微服务架构中,我们可以使用 plotly.utils.PlotlyJSONEncoder 将图表对象序列化为 JSON,通过 API 返回给前端。这样可以实现数据与视图的分离,提高复用性。
from plotly.utils import PlotlyJSONEncoder
import json

# 生成图表对象
fig = px.pie(...)

# 序列化为 JSON 格式供 API 使用
graphJSON = json.dumps(fig, cls=PlotlyJSONEncoder)
  • 监控与可观测性:如果你的可视化服务运行在 Kubernetes 上,务必添加追踪代码,记录每次图表生成的耗时,以便及时发现性能瓶颈。

最佳实践与常见陷阱

在掌握了基本技能后,我们需要谈谈什么时候不应该使用饼图,以及如何避免常见的错误。

  • 避免类别过多:如果你的 names 列中有超过 5-7 个不同的类别,饼图将变得非常难以阅读。在这种情况下,用户的眼睛很难比较扇区的大小。这时,条形图(Bar Chart)通常是更好的选择。
  • 保持颜色逻辑:如果你使用颜色来代表某种含义(例如红色代表亏损,绿色代表盈利),请确保在你的所有图表中保持这种逻辑一致性。不要为了美观而随意分配颜色,以免误导读者。
  • 数据排序:有时候,将扇区按大小排序(从大到小)会让数据更容易理解。虽然 Plotly 默认按 names 的字母顺序或数据顺序排列,但你可以在绘图前对 DataFrame 进行排序,以获得更符合直觉的视觉效果。

总结

通过这篇文章,我们从基础出发,逐步深入了解了 Plotly Express 的 pie 函数,并结合了现代软件工程的最佳实践。我们学习了:

  • 如何使用最简单的列表数据创建饼图。
  • 如何利用 Pandas DataFrame 进行数据分组,让 Plotly 自动完成繁重的聚合计算。
  • 如何通过自定义标题、悬停数据和颜色方案,将普通的图表升级为专业的可视化作品。
  • 探索了环形图的制作方法以及相关的文本格式化技巧。
  • 讨论了在 2026 年的视角下,如何结合 AI 辅助开发、处理工程化边界情况以及进行性能优化。

Plotly 的魅力在于它的简洁与强大并存。你现在可以直接将这些代码片段应用到你的数据分析项目中。希望这篇指南能帮助你更有效地讲述你的数据故事。如果你有任何问题或想要尝试更复杂的图表组合,欢迎继续探索 Plotly 的官方文档,那里有更多宝藏等待你发掘。祝你绘图愉快!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/32648.html
点赞
0.00 平均评分 (0% 分数) - 0