
Data-Science-For-Beginners 比例可视化实战用蘑菇数据集绘制饼图、环形图与华夫饼图【免费下载链接】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比例可视化编写围绕课程自带的蘑菇数据集 data/mushrooms.csv完整讲解分组计数 → 比例绘图这一比例可视化工作流如何用 Matplotlib 绘制饼图与环形图、如何用 PyWaffle 绘制华夫饼图并给出数据清洗object 转 category的关键步骤。读完后你将能在自己的项目里独立复现这三类部分占整体的比例图表并理解标签顺序、绘图参数等细节对成图效果的影响。课程为本课配有一张手绘笔记Sketchnote概括了比例可视化的核心概念说明本文内容取自课程的本格拉语Bengali翻译版文档 translations/bn/3-Data-Visualization/11-visualization-proportions/README.md其内容与英文原版 3-Data-Visualization/11-visualization-proportions/README.md 一致该翻译文档声明其由 AI 翻译服务 Co-op Translator 生成英文原版为权威版本。文中涉及的外部测验平台、Charticulator、matplotlib 官方文档等链接在原文档中以超链接给出本文按规范不再重复列出仅保留名称与用途说明。课程背景为什么用蘑菇数据集讲比例可视化本课题材来自一个自然主题的开源数据集它源自 Audubon 提供的蘑菇资料记录了 Agaricus蘑菇属与 Lepiota伞菌属两个科属下 23 种褶伞gilled mushrooms的特征。数据集共有8124 条记录、23 个属性列每一行描述一种蘑菇样本的形态特征例如菌盖形状cap-shape、菌盖颜色cap-color、菌柄形态stalk-shape、生长环境habitat以及最关键的目标类别classEdible 可食用 / Poisonous 有毒。仓库中的实际文件为 data/mushrooms.csv共 8125 行含表头。课程围绕这个数据集安排了三类部分占整体proportion图表的练习饼图Pie chart用扇形面积表示各类别占比环形图Donut chart饼图中间挖空可在中心区放总量或标题华夫饼图Waffle chart用二维方格阵列表示数量比例粒度更细。课程还提到了一个补充工具微软研究院的拖放式可视化项目 Charticulator其教程中也用到了这个蘑菇数据集可以作为边学库、边玩数据的延伸练习挑战题部分会再提到。数据准备读懂蘑菇数据集并做类型转换导入数据并查看前几行课程给出的第一步是导入数据集并查看头部数据import pandas as pd import matplotlib.pyplot as plt mushrooms pd.read_csv(../../data/mushrooms.csv) mushrooms.head()注意路径写法../../data/mushrooms.csv是相对于课程目录3-Data-Visualization/11-visualization-proportions/的相对路径数据文件位于仓库根目录下的 data/mushrooms.csv。如果你在自己新建的 notebook 中运行请按 notebook 实际所在目录调整路径。head()输出的前 4 行数据长这样23 列均为文本取值classcap-shapecap-surfacecap-colorbruisesodorgill-attachmentgill-spacinggill-sizegill-colorstalk-shapestalk-rootstalk-surface-above-ringstalk-surface-below-ringstalk-color-above-ringstalk-color-below-ringveil-typeveil-colorring-numberring-typespore-print-colorpopulationhabitatPoisonousConvexSmoothBrownBruisesPungentFreeCloseNarrowBlackEnlargingEqualSmoothSmoothWhiteWhitePartialWhiteOnePendantBlackScatteredUrbanEdibleConvexSmoothYellowBruisesAlmondFreeCloseBroadBlackEnlargingClubSmoothSmoothWhiteWhitePartialWhiteOnePendantBrownNumerousGrassesEdibleBellSmoothWhiteBruisesAniseFreeCloseBroadBrownEnlargingClubSmoothSmoothWhiteWhitePartialWhiteOnePendantBrownNumerousMeadowsPoisonousConvexScalyWhiteBruisesPungentFreeCloseNarrowBrownEnlargingEqualSmoothSmoothWhiteWhitePartialWhiteOnePendantBlackScatteredUrban识别 object 类型列并转换为 category一眼就能看出这个数据集的所有列都是文本。要把它用于分类计数与比例绘图先要明确哪些列是字符串object类型print(mushrooms.select_dtypes([object]).columns)输出为全部 23 列的 IndexIndex([class, cap-shape, cap-surface, cap-color, bruises, odor, gill-attachment, gill-spacing, gill-size, gill-color, stalk-shape, stalk-root, stalk-surface-above-ring, stalk-surface-below-ring, stalk-color-above-ring, stalk-color-below-ring, veil-type, veil-color, ring-number, ring-type, spore-print-color, population, habitat], dtypeobject)课程随后把全部 object 列统一转换为 category类别类型cols mushrooms.select_dtypes([object]).columns mushrooms[cols] mushrooms[cols].astype(category)这一步的实战意义有两点其一category 类型明确表达这是一个有限取值的分类变量语义上比 object 字符串更准确其二对 8124 行的宽表23 列而言category 编码在存储上比逐格存储字符串更紧凑。按 class 分组计数转换完成后按class列分组统计每组的行数edibleclass mushrooms.groupby([class]).count() edibleclass结果是一个以 class 为索引、各列均为该组非空计数的表class各特征列计数Edible4208Poisonous3916这个分组结果已对仓库数据核对data/mushrooms.csv 中 Edible 共 4208 行、Poisonous 共 3916 行合计 8124 行与文档表格一致。由于count()统计的是每列非空值个数而该数据没有缺失值所以任意一列的计数都等于该组样本总数——这也是后面饼图代码可以直接取edibleclass[population]作为数值序列的原因。课程特别提醒了一点做比例图时非常关键扇形或图例与 labels 数组是按位置一一对应的标签顺序必须与分组结果的行顺序严格一致。groupby默认按索引字母序排列Edible 在 Poisonous 前因此下面的 labels 数组才写成了[Edible,Poisonous]。饼图两分类占比的经典表达基于上一步的分组计数课程绘制了第一个饼图labels [Edible, Poisonous] plt.pie(edibleclass[population], labelslabels, autopct%.1f %%) plt.title(Edible?) plt.show()参数说明edibleclass[population]传入 [4208, 3916] 两个数值Matplotlib 会自动按总量归一化成扇形角度labels扇形图例顺序必须与数值序列一致即 Edible 对应 4208autopct%.1f %%在每个扇形上自动标注百分比保留一位小数注意在普通字符串中需要写成%%转义plt.title(Edible?)标题点出这个数据集的核心问题——能吃吗。成图直观展示了两类蘑菇的比例可食用蘑菇4208/8124 ≈ 51.8%略多于有毒蘑菇3916/8124 ≈ 48.2%。课程强调标签顺序对了图才有意义——如果 labels 写反扇形数值本身不变但图例含义会完全颠倒这是一类非常隐蔽的绘图错误。环形图在饼图基础上加个洞环形图Donut chart是中间带洞的饼图。课程用它来展示蘑菇的 7 种生长环境habitat。先按 habitat 分组计数habitat mushrooms.groupby([habitat]).count() habitat分组结果按字母序得到 7 类环境。核对 data/mushrooms.csv 后各类计数为Grasses 2148、Leaves 832、Meadows 292、Paths 1144、Urban 368、Waste 192、Wood 3148合计 8124其中 Wood 是最大类别。据此构建环形图labels [Grasses, Leaves, Meadows, Paths, Urban, Waste, Wood] plt.pie(habitat[class], labelslabels, autopct%1.1f%%, pctdistance0.85) center_circle plt.Circle((0, 0), 0.40, fcwhite) fig plt.gcf() fig.gca().add_artist(center_circle) plt.title(Mushroom Habitats) plt.show()这段代码的原理可以拆成三步理解plt.pie(...)照常绘制饼图pctdistance0.85控制百分比文字到圆心的距离半径比例 0.85plt.Circle((0, 0), 0.40, fcwhite)构造一个以原点为圆心、半径 0.40、白色填充的圆——它就是挖掉的洞fig.gca().add_artist(center_circle)把这个白色圆叠加到当前坐标轴上覆盖住饼图中心视觉上就形成了环。课程给出的调参技巧修改0.40即可调整环的粗细——半径越小环越粗中心留白越少半径越接近 1环越细。此外环形图的标签还可以做高亮explode处理来突出某一类提升可读性课程原文档指引读者查阅 matplotlib 官方文档中饼图与环形图标签一节此处不贴外部链接。华夫饼图用方格阵列表达数量比例华夫饼图Waffle chart是表达数量的另一种方式把数据画成一个 2D 方格阵列每格代表固定份数用颜色区分类别。它比饼图粒度更细适合展示多类别、量级差异大的比例结构。课程用它来展示菌盖颜色cap-color的分布。安装辅助库 PyWaffle绘制华夫饼图需要额外安装 PyWaffleMatplotlib 生态的第三方库pip install pywaffle按菌盖颜色分组capcolor mushrooms.groupby([cap-color]).count() capcolor分组计数结果按字母序为Buff 168、Brown 2284、Cinnamon 44、Green 1856、Pink 144、Purple 16、Red 1500、White 1040、Yellow 1072合计 8124已对仓库数据核对。构建华夫饼图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( FigureClassWaffle, rows100, valuesdf.amount, labelslist(df.color), figsize(30, 30), colors[brown, tan, maroon, green, pink, purple, red, whitesmoke, yellow], )关键参数FigureClassWaffle把 PyWaffle 的Waffle类作为 Figure 类plt.figure直接产出一个华夫饼图对象PyWaffle 在底层基于 Matplotlib 绘制rows100方格阵列的行数100 行 × 100 列共 10000 格数据集合计 8124 条即约 81% 的格子会被着色valuesdf.amount每个类别对应的数量序列来自上一步的分组计数labelslist(df.color)图例名称序列与values按位置一一对应figsize(30, 30)输出画布尺寸方格阵列需要较大画布才清晰colors9 个颜色值顺序同样与类别序列对应其中whitesmoke用于区分白色菌盖与背景。课程指出成图的一个直观发现绿色菌盖Green1856 条的蘑菇相当多位居棕色2284之后。这里有一个值得注意的细节从文档代码结构看labels列表写成了[brown, buff, ...]brown 在前、buff 在后且为小写而groupby的字母序结果中 Buff 在 Brown 之前数据取值为 Title 大小写。也就是说如果照抄这段代码图例名称与数量序列的前两项会错位brown 图例会对应 buff 的数量 168。这与课程在饼图部分强调的务必核对 labels 顺序是同一个坑读者复现时建议把 labels 写成与分组结果一致的顺序例如[Buff, Brown, Cinnamon, Green, Pink, Purple, Red, White, Yellow]。课程还给出一个进阶玩法PyWaffle 支持使用 Font Awesome 图标库中的任意图标替代方格可以做出图标版华夫饼图比如每个格子画一个小蘑菇图标适合作为可视化创意练习。仓库中的配套 Notebook 与实践入口课程目录下提供了两个 notebook方便在 Jupyter 环境中逐步复现3-Data-Visualization/11-visualization-proportions/notebook.ipynb课程练习用 notebook当前仅包含标题单元格# Mushroom Proportions是留给学员填写的起点模板3-Data-Visualization/11-visualization-proportions/solution/notebook.ipynb参考解答 notebook其代码单元格与本文三节图表代码一一对应包含按 class 分组画饼图、按 habitat 分组画环形图、按 cap-color 分组并用 PyWaffle 画华夫饼图的完整流程可以作为逐格对照的调试基准。从 notebook 的单元组织看解答版把类型转换select_dtypesastype(category)放在所有绘图之前印证了本文数据准备一节的流程先规范类型再分组计数最后按标签顺序绘图。练习与挑战课程为本课设置了以下实践任务挑战Challenge尝试在 Charticulator 中重新构建本课的三类图表。Charticulator 是微软研究院的拖放式数据可视化工具其官方教程之一恰好也使用这个蘑菇数据集因此可以一边探索数据、一边学习新库。课后作业Assignment在 Excel 中完成同样的三类图表。课程配套文档 3-Data-Visualization/11-visualization-proportions/assignment.md 给出了评分标准Rubric等级标准Exemplary优秀提交包含全部三种图表饼图、环形图、华夫饼图的 Excel 工作表Adequate合格提交包含两种图表的 Excel 工作表Needs Improvement需改进只包含一种图表测验课程平台为本课配有课前测验Pre-lecture quiz与课后测验Post-lecture quiz入口在课程页面外部测验平台本文不列出链接。延伸思考什么时候该用饼图、环形图或华夫饼图课程在Review Self Study部分指出什么时候用饼图、环形图或华夫饼图并不是一个显然的问题并推荐阅读几篇专门讨论饼图 vs 环形图与华夫饼图适用场景的文章原文档以链接形式给出此处从略鼓励读者自行研究这个黏性的选型决策。结合本文的实操过程可以提炼出几条可验证的经验类别数量少如 27 个、想表达部分占整体时饼图/环形图最直观——本课的 class2 类与 habitat7 类正是两个典型场景需要突出某一类别、或在中心展示总量/标题时环形图优于实心饼图白色中心圆天然提供了一个标注区类别较多、量级差异大、需要更细的占比感知时华夫饼图的方格粒度本课为 1 格 1 条样本比扇形角度更容易精确比较——Brown 2284 与 Green 1856 的差异在扇形上不易分辨在华夫饼图上则一目了然无论用哪种图labels 顺序与分组计数结果的顺序一致是正确性的前提groupby默认按字母序排列索引复现时务必先打印分组结果再写 labels。小结本课通过蘑菇数据集完整演示了比例可视化的三种工具先用select_dtypesastype(category)把全 object 类型的数据规范为类别类型再用groupby(...).count()得到各类别计数然后分别以 Matplotlib 的plt.pie饼图、plt.Circle叠加白色中心圆环形图和 PyWaffle 的WaffleFigure华夫饼图完成成图。三种图都能给用户一个数据集瞬间快照而标签顺序、pctdistance、中心圆半径、rows/values/labels的对应关系等细节正是把画得出提升到画得对、画得准的关键。仓库中的 data/mushrooms.csv 与 solution/notebook.ipynb 提供了全部复现所需的素材可直接在 Jupyter 环境中跟随练习。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考