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 这种电子表格工具中完成占比可视化。它考察的能力点是:
- 理解三种图表(饼图 / 环形图 / 华夫图)在视觉呈现比例信息上的差异;
- 能够把任意数据集(如课程自带的蘑菇数据集)的某一分类维度整理成 Excel 可用的数值结构;
- 能熟练操作 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),例如:
| class | cap-shape | cap-surface | cap-color | bruises | odor | ... | habitat |
|---|---|---|---|---|---|---|---|
| Poisonous | Convex | Smooth | Brown | Bruises | Pungent | ... | Urban |
| Edible | Convex | Smooth | Yellow | Bruises | Almond | ... | Grasses |
| Edible | Bell | Smooth | White | Bruises | Anise | ... | 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() habitatlabels = ['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 列的真实蘑菇分类数据。
常见踩坑与建议
- 标签顺序必须与分组索引一致:无论 Python 还是 Excel,饼图扇区与标签是按下标一一对应的,顺序错位会导致"有毒/可食"标注颠倒,务必核对
groupby结果的索引顺序。 - Excel 饼图的数据区必须是数值:文本型列(如直接把 23 个蘑菇字段拖入图表)无法生成饼图,需要先用
COUNTIF或数据透视表把分类汇总成数值列。 - 华夫图先定"每格代表多少":建议先确定网格总格数(如 100),再用"总量 ÷ 格数"反推每格数值,四舍五入后保证各方块数量总和与总量一致,避免比例失真。
- 图表选型看信息量:分类少(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),仅供参考