用 R 可视化蘑菇数据集比例:饼图、环形图与华夫饼图实战
【免费下载链接】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 课(R 语言版),以蘑菇数据集为核心,系统讲解如何在 R 中把文本型分类数据聚合成比例,并用饼图(Pie Chart)、环形图(Donut Chart)与华夫饼图(Waffle Chart)三种图表完成比例可视化。读完本文,你将掌握dplyr分组聚合、pie()基础绘图、webr库的PieDonut()环形图以及waffle库华夫饼图的完整使用流程,并理解标签顺序对比例图准确性的关键影响。
认识蘑菇数据集
本节实验数据来自美国奥杜邦协会(Audubon)发布的蘑菇数据集,包含伞菌科 Agaricus 与 Lepiota 两个属共 23 种有菌褶蘑菇的观测记录。在仓库中该数据位于 data/mushrooms.csv,共 8124 条样本,其中可食用(Edible)4208 条、有毒(Poisonous)3916 条。
首先将数据集读入 R,并查看前几行:
mushrooms = read.csv('data/mushrooms.csv') head(mushrooms)打印出的表格包含丰富的分析字段:
| 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Poisonous | Convex | Smooth | Brown | Bruises | Pungent | Free | Close | Narrow | Black | Enlarging | Equal | Smooth | Smooth | White | White | Partial | White | One | Pendant | Black | Scattered | Urban |
| Edible | Convex | Smooth | Yellow | Bruises | Almond | Free | Close | Broad | Black | Enlarging | Club | Smooth | Smooth | White | White | Partial | White | One | Pendant | Brown | Numerous | Grasses |
| Edible | Bell | Smooth | White | Bruises | Anise | Free | Close | Broad | Brown | Enlarging | Club | Smooth | Smooth | White | White | Partial | White | One | Pendant | Brown | Numerous | Meadows |
| Poisonous | Convex | Scaly | White | Bruises | Pungent | Free | Close | Narrow | Brown | Enlarging | Equal | Smooth | Smooth | White | White | Partial | White | One | Pendant | Black | Scattered | Urban |
| Edible | Convex | Smooth | Green | No Bruises | None | Free | Crowded | Broad | Black | Tapering | Equal | Smooth | Smooth | White | White | Partial | White | One | Evanescent | Brown | Abundant | Grasses |
| Edible | Convex | Scaly | Yellow | Bruises | Almond | Free | Close | Broad | Brown | Enlarging | Club | Smooth | Smooth | White | White | Partial | White | One | Pendant | Black | Numerous | Grasses |
可以看到全部字段都是文本型(类别型)数据。用names()查看列名,R 会自动把 CSV 中的连字符转换为点号:
names(mushrooms)输出如下,共 23 个字段:
[1] "class" "cap.shape" [3] "cap.surface" "cap.color" [5] "bruises" "odor" [7] "gill.attachment" "gill.spacing" [9] "gill.size" "gill.color" [11] "stalk.shape" "stalk.root" [13] "stalk.surface.above.ring" "stalk.surface.below.ring" [15] "stalk.color.above.ring" "stalk.color.below.ring" [17] "veil.type" "veil.color" [19] "ring.number" "ring.type" [21] "spore.print.color" "population" [23] "habitat"在使用图表展示比例之前,需要把数据按类别聚合。借助dplyr的管道操作,按class(有毒/可食用)分组并统计样本数:
library(dplyr) grouped=mushrooms %>% group_by(class) %>% summarise(count=n())用View(grouped)查看聚合结果:
| class | count |
|---|---|
| Edible | 4208 |
| Poisonous | 3916 |
这个统计结果与源数据文件 data/mushrooms.csv 中两类样本的实际计数完全一致(可食用 4208、有毒 3916),可作为分组聚合正确性的验证依据。接下来就可以按照表中 Edible、Poisonous 的顺序构建饼图了。
饼图:一图看懂可食用与有毒蘑菇的比例
R 自带的基础绘图函数pie()可以直接接受数值向量与标签向量:
pie(grouped$count,grouped$class, main="Edible?")运行后即可得到展示可食用与有毒蘑菇比例的饼图:
⚠️关键点:标签顺序必须与数值向量顺序一一对应。pie()按位置配对count与class,如果标签数组的顺序与聚合结果不一致,图表含义会完全颠倒。因此务必反复核对grouped表中类别与计数的先后次序。
环形图:多类栖息地比例一目了然
环形图(Donut Chart)本质上是中间挖空一块的饼图,观感更清爽,也便于在中心区域额外标注信息。下面用蘑菇的栖息地(habitat)字段做演示。
先用dplyr按栖息地分组聚合:
library(dplyr) habitat=mushrooms %>% group_by(habitat) %>% summarise(count=n()) View(habitat)输出结果:
| habitat | count |
|---|---|
| Grasses | 2148 |
| Leaves | 832 |
| Meadows | 292 |
| Paths | 1144 |
| Urban | 368 |
| Waste | 192 |
| Wood | 3148 |
共 7 类栖息地,将它们作为环形图的标签。这里借助webr库的PieDonut()函数,一行代码即可生成带百分比标注的环形图:
library(ggplot2) library(webr) PieDonut(habitat, aes(habitat, count=count))这段代码同时使用了ggplot2与webr两个库,PieDonut函数封装了环形图的核心绘制逻辑。此外,仅使用ggplot2也可以手工构造环形图(例如用geom_bar()结合coord_polar()并挖空中心),本课程的配套解决方案见 3-Data-Visualization/11-visualization-proportions/solution/notebook.ipynb,可作为延伸练习的参考。
华夫饼图:用方格阵列表达数量比例
华夫饼图(Waffle Chart)以二维方格阵列的形式展示数量比例——每个方格代表一定数量的样本,方格密度直观反映各类别占比。这里用蘑菇的菌盖颜色(cap.color)字段做演示。
首先从 CRAN 安装waffle辅助库:
install.packages("waffle", repos = "https://cinc.rud.is")然后按菌盖颜色分组聚合:
library(dplyr) cap_color=mushrooms %>% group_by(cap.color) %>% summarise(count=n()) View(cap_color)接下来为每组数量命名,并生成华夫饼图。注意这里把计数除以 10,即每个方格代表 10 朵蘑菇,从而控制方格总量:
library(waffle) names(cap_color$count) = paste0(cap_color$cap.color) waffle((cap_color$count/10), rows = 7, title = "Waffle Chart")+scale_fill_manual(values=c("brown", "#F0DC82", "#D2691E", "green", "pink", "purple", "red", "grey", "yellow","white"))华夫饼图可以清晰看出菌盖颜色的比例分布。有趣的是,数据集中绿色菌盖的蘑菇数量相当可观——这也是不同图表类型带来的观察视角差异。
小结:三种比例图的选型与核心要点
本课用同一个蘑菇数据集演示了三种比例可视化方法,统一的工作流是:先分组聚合数据,再选择合适的图形展示。
| 图表类型 | 适用场景 | 核心函数/库 | 注意要点 |
|---|---|---|---|
| 饼图 | 类别较少(2~5 类)的整体占比 | pie() | 标签顺序必须与数值一一对应 |
| 环形图 | 多类别占比且希望在中心补充信息 | webr::PieDonut() | 7 类以上可考虑条形图替代 |
| 华夫饼图 | 以方格密度直观表达数量比例 | waffle::waffle() | 通过除法控制每个方格代表的样本量 |
三者都能让读者在几秒内对数据集形成直观的比例印象。若想进一步练习,可尝试在 Charticulator。
此外,本课程在 Python 版本中提供了同一主题的等价实现(使用matplotlib与pywaffle),Notebook 位于 3-Data-Visualization/11-visualization-proportions/notebook.ipynb,R 与 Python 两版代码可以对照学习,帮助理解比例可视化在不同语言生态中的通用思路。
说明:本文章节基于课程翻译文档 translations/en/3-Data-Visualization/R/11-visualization-proportions/README.md 整理,原始课程图稿可参考 sketchnotes/11-Visualizing-Proportions.png。
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考