news 2026/9/12 10:06:38

Data-Science-For-Beginners 占比可视化实战:在 Excel 与 Python 中制作饼图、环形图与华夫图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Data-Science-For-Beginners 占比可视化实战:在 Excel 与 Python 中制作饼图、环形图与华夫图

Data-Science-For-Beginners 占比可视化实战:在 Excel 与 Python 中制作饼图、环形图与华夫图

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

本文围绕 Data-Science-For-Beginners 课程第 11 课 "Visualizing Proportions" 的课后作业 "Try it in Excel" 展开,讲解如何基于自选数据集在 Excel 中一次完成饼图(Pie)、环形图(Donut)与华夫图(Waffle)三种占比可视化,并结合课程配套的蘑菇数据集(data/mushrooms.csv)与 Python 参考实现(matplotlib + PyWaffle),讲清"数据分组 → 图表选型 → 绘制输出"的完整链路。读完本文,你将掌握三种占比图表各自的适用场景、Python 端的标准写法,以及如何在 Excel 中完成等价复刻并通过作业评分。

作业要求解读:在 Excel 里画出三种占比图

课程在第 11 课结束时布置了一项动手作业(对应英文原版 3-Data-Visualization/11-visualization-proportions/assignment.md),其核心要求可以概括为:

你是否知道可以在 Excel 中创建环形图、饼图和华夫图?请使用一个自选数据集,直接在 Excel 工作表中创建这三种图表。

也就是说,作业并不要求写代码,而是要求你在 Excel 这种电子表格工具中完成占比可视化。它考察的能力点是:

  1. 理解三种图表(饼图 / 环形图 / 华夫图)在视觉呈现比例信息上的差异;
  2. 能够把任意数据集(如课程自带的蘑菇数据集)的某一分类维度整理成 Excel 可用的数值结构;
  3. 能熟练操作 Excel 图表功能,甚至借助条件格式等技巧实现非原生图表类型(华夫图)。

课程主文档 3-Data-Visualization/11-visualization-proportions/README.md 中给出了一条明确的学习路径:先用 Python 理解数据分组逻辑,再用三种图表绘制比例关系,最后可以回到 Excel 中做等价实践——这正是本次作业的用意。

数据准备:先认识蘑菇数据集

作业允许使用"自选数据集",课程推荐使用蘑菇数据集 data/mushrooms.csv。该数据来自 Audubon 对 Agaricus 和 Lepiota 两科 23 种有鳃蘑菇的描述,包含 8124 条样本、23 个字段(class、cap-shape、cap-surface、cap-color、bruises、odor、gill-、stalk-、veil-、ring-、spore-print-color、population、habitat 等),字段全部为文本型(object),例如:

classcap-shapecap-surfacecap-colorbruisesodor...habitat
PoisonousConvexSmoothBrownBruisesPungent...Urban
EdibleConvexSmoothYellowBruisesAlmond...Grasses
EdibleBellSmoothWhiteBruisesAnise...Meadows

在 Python 中加载并观察数据:

import pandas as pd import matplotlib.pyplot as plt mushrooms = pd.read_csv('data/mushrooms.csv') mushrooms.head()

由于全部字段都是文本,绘图前需要把目标列转换为 category 类型,再按类别分组计数:

cols = mushrooms.select_dtypes(["object"]).columns mushrooms[cols] = mushrooms[cols].astype('category') edibleclass = mushrooms.groupby(['class']).count() edibleclass

按 class(有毒/可食)分组后得到:Edible 4208 条、Poisonous 3916 条。这就是后续绘制"可食 vs 有毒"饼图的数据基础。

同理,按 habitat(栖息地)分组可得到 7 个类别(Grasses、Leaves、Meadows、Paths、Urban、Waste、Wood),按 cap-color(菌盖颜色)分组可得到 9 个类别(brown、buff、cinnamon、green、pink、purple、red、white、yellow),它们分别是环形图与华夫图的数据来源。课程配套的解答笔记本 3-Data-Visualization/11-visualization-proportions/solution/notebook.ipynb 中保留了完整的中间输出结果,可作为核对依据。

Python 参考实现一:饼图(Pie)

饼图是最直观的占比可视化方式。课程给出的参考实现如下:

labels = ['Edible', 'Poisonous'] plt.pie(edibleclass['population'], labels=labels, autopct='%.1f %%') plt.title('Edible?') plt.show()

关键参数说明:

  • labels:扇区标签数组,顺序必须与groupby结果的索引顺序严格一致(先 Edible 后 Poisonous),否则标签会张冠李戴;
  • autopct='%.1f %%':在扇区内部显示保留一位小数的百分比;
  • plt.title('Edible?'):为图表添加标题。

从图中可以一眼看出可食与有毒蘑菇在样本中的占比结构,这正是"比例可视化"的核心价值。

Python 参考实现二:环形图(Donut)

环形图本质上是中间挖空的饼图,视觉上更紧凑,也更利于把信息聚焦在环形本身。课程以蘑菇的栖息地(habitat)分布为例:

habitat = mushrooms.groupby(['habitat']).count() habitat
labels = ['Grasses', 'Leaves', 'Meadows', 'Paths', 'Urban', 'Waste', 'Wood'] plt.pie(habitat['class'], labels=labels, autopct='%1.1f%%', pctdistance=0.85) center_circle = plt.Circle((0, 0), 0.40, fc='white') fig = plt.gcf() fig.gca().add_artist(center_circle) plt.title('Mushroom Habitats') plt.show()

实现环形图的关键手法是在饼图之上叠加一个白色圆形

  • plt.pie(..., pctdistance=0.85):把百分比标签向内收缩到 0.85 半径处,避免与环形重叠;
  • plt.Circle((0, 0), 0.40, fc='white'):在原点创建一个半径为 0.40 的白色圆;
  • fig.gca().add_artist(center_circle):把该圆叠加到已有图表上,从而"挖出"中间的空洞。

调整内孔宽度只需修改0.40这个半径值:值越大内孔越宽、环形越细;值越小内孔越窄、环形越粗。从仓库中的 解答笔记本 可以看到同样的实现被完整保留。

此外,环形图的标签可以通过调整位置、加大字号等方式进一步提升可读性——这也是占比类图表在实战中常做的微调。

Python 参考实现三:华夫图(Waffle)

华夫图用二维方块阵列来表示数量比例,每个方块代表固定数量的样本,视觉上接近"马赛克瓷砖",非常适合在信息密度高的场合展示占比。课程以菌盖颜色(cap-color)分布为例,需要先安装辅助库 PyWaffle:

pip install pywaffle

然后选择数据分段并分组:

capcolor = mushrooms.groupby(['cap-color']).count() capcolor

绘制华夫图:

import pandas as pd import matplotlib.pyplot as plt from pywaffle import Waffle data = {'color': ['brown', 'buff', 'cinnamon', 'green', 'pink', 'purple', 'red', 'white', 'yellow'], 'amount': capcolor['class'] } df = pd.DataFrame(data) fig = plt.figure( FigureClass=Waffle, rows=100, values=df.amount, labels=list(df.color), figsize=(30, 30), colors=["brown", "tan", "maroon", "green", "pink", "purple", "red", "whitesmoke", "yellow"], )

参数含义:

  • rows=100:华夫图共 100 行,配合总量可推算出每个方块代表的样本数(总量 ÷ 方块总数);
  • values=df.amount:各分类的数值序列(来自capcolor的分组计数);
  • labels=list(df.color):分类标签,顺序与values一一对应;
  • colors=[...]:为每个分类指定方块颜色,这里按颜色名选择了与真实菌盖颜色相近的色值(brown、tan、maroon、green、pink、purple、red、whitesmoke、yellow)。

从华夫图中可以直观看到:绿色菌盖的蘑菇数量相当多(按解答笔记本中的计数,Green 达 1856 条),这与饼图/环形图给出的比例信息一致,但呈现方式完全不同。

在 Excel 中复刻三种图表(作业核心)

完成 Python 端的理解后,回到作业本身:在 Excel 中把三种图表全部画出来。结合 Excel 的常见操作方式,可按以下思路进行:

1. 饼图(原生支持)

  • 在 Excel 工作表中准备两列数据:一列是分类名称(如 Edible / Poisonous),一列是对应的数值(如 4208 / 3916);
  • 选中数据区域,点击"插入 → 饼图",选择"饼图"样式即可;
  • 通过"图表设计"选项卡可调整配色、添加数据标签与百分比显示(对应 Python 中的autopct)。

2. 环形图(原生支持)

  • 使用同样的分类 + 数值两列数据;
  • 在"插入 → 饼图"下拉菜单中选择"圆环图"(Doughnut),即可直接得到环形效果——无需像 matplotlib 那样手工叠加白色圆形
  • 右键图表"设置数据系列格式",可调整圆环内径大小(对应 Python 中修改0.40半径的效果);
  • 数据标签位置、百分比格式都可以在"设置数据标签格式"中调整。

3. 华夫图(借助条件格式实现)

Excel 没有内置的"华夫图"图表类型,常见做法是用条件格式构造方块网格

  • 在一个 10×10(或按总量取整的行列)的单元格区域中,根据各分类占比预先填充对应数量的"占位值";
  • 选中该区域,使用"开始 → 条件格式 → 新建规则 → 基于各自值设置所有单元格的格式",按数值区间为不同分类赋予不同填充色;
  • 调整行高列宽使单元格呈正方形,即可得到与 PyWaffle 输出等价的华夫网格效果。

Excel 版华夫图的关键是保证"每个方块代表相同数量的样本",这样颜色块的面积比例才与实际占比严格对应。

评分标准与验收清单

作业附带了明确的评分标准(Rubric),转换为中文后如下:

优秀(Exemplary)合格(Adequate)需改进(Needs Improvement)
提交的 Excel 工作表中包含全部三种图表(饼图、环形图、华夫图)提交的 Excel 工作表中包含两种图表提交的 Excel 工作表中仅包含一种图表

自测清单:

  • 工作表中饼图、环形图、华夫图三种图表是否齐全?
  • 三种图表是否基于同一个数据集(如蘑菇数据集)且分类维度清晰?
  • 华夫图的方块数量与占比是否与数据一致?
  • 图表标题、图例、数据标签是否完整可读?

仓库配套资源与延伸

  • 课程主文档:3-Data-Visualization/11-visualization-proportions/README.md——完整的 Python 教程与三种图表讲解;
  • 解答笔记本:3-Data-Visualization/11-visualization-proportions/solution/notebook.ipynb——带全部运行输出的可复现代码,包含 Edible 4208 / Poisonous 3916 及各 habitat、cap-color 分组计数;
  • R 语言对照版:3-Data-Visualization/R/11-visualization-proportions/README.md——使用 dplyr + ggplot2/webr 完成同样的三种占比图,适合偏好 R 生态的读者对照学习;
  • 数据文件:data/mushrooms.csv——8124 行 × 23 列的真实蘑菇分类数据。

常见踩坑与建议

  1. 标签顺序必须与分组索引一致:无论 Python 还是 Excel,饼图扇区与标签是按下标一一对应的,顺序错位会导致"有毒/可食"标注颠倒,务必核对groupby结果的索引顺序。
  2. Excel 饼图的数据区必须是数值:文本型列(如直接把 23 个蘑菇字段拖入图表)无法生成饼图,需要先用COUNTIF或数据透视表把分类汇总成数值列。
  3. 华夫图先定"每格代表多少":建议先确定网格总格数(如 100),再用"总量 ÷ 格数"反推每格数值,四舍五入后保证各方块数量总和与总量一致,避免比例失真。
  4. 图表选型看信息量:分类少(2~5 类)适合饼图;类别稍多且希望弱化中心区域时选环形图;需要以"单位方块"精确传递数量感时选华夫图。三种图表表达的是同一份比例信息,选择标准是"读者能否最快、最准确地读出占比"。

完成作业后,可以尝试把同样的流程迁移到自选数据集(如课程数据目录中的 data/birds.csv、data/honey.csv 等),进一步巩固"分组 → 选型 → 绘制"的占比可视化方法论。

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 10:05:22

Astra级系统实战:Mid-turn Steering与Async Tool Calling工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 10:05:06

LiteMonitor:轻量级硬件监控工具的原理与应用

1. LiteMonitor初体验:极简主义的硬件监控方案第一次接触LiteMonitor是在寻找替代任务管理器的过程中。作为一款开源免费的硬件监控工具,它用0.8MB的安装包实现了CPU/内存/磁盘/网络等核心指标的实时可视化。最让我惊喜的是其资源占用——在i5-1135G7笔记…

作者头像 李华
网站建设 2026/9/12 10:03:41

Python实现抽卡游戏:从蓝桥杯算法到实战开发

1. 蓝桥抽卡游戏代码解析:从竞赛真题到实战开发作为一名参加过多次蓝桥杯竞赛的老选手,我发现在算法竞赛中,概率与随机数相关的题目往往最能考察选手的综合能力。2014年省赛的"六角填数"和第十二届的"金字塔"等真题&…

作者头像 李华
网站建设 2026/9/12 10:02:31

Rust Web框架选型:Actix与Axum深度对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 10:00:50

网站地图完全指南:7种Sitemap类型与Python批量生成方案

做网站的人迟早会碰上一个需求:把全站的页面结构整理成一份搜索引擎和访客都能看懂的地图。我第一次给站点写网站地图的时候,是去在线生成器里丢一串网址,点一下按钮拿到一个 xml 文件,往根目录一放就以为大功告成。后来站点越来越…

作者头像 李华
网站建设 2026/9/12 9:59:50

OpenCore Legacy Patcher 完整指南:3 步让旧款 Mac 装上最新系统

OpenCore Legacy Patcher 完整指南:3 步让旧款 Mac 装上最新系统 【免费下载链接】tiny-rdm Tiny RDM (Tiny Redis Desktop Manager) - A modern, colorful, super lightweight Redis GUI client for Mac, Windows, and Linux. It also provides a web version that…

作者头像 李华