
使用 R 与 ggplot2 可视化数量明尼苏达鸟类数据集实战指南【免费下载链接】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 中的第 9 课Visualizing QuantitiesR 语言版为骨架围绕 data/birds.csv明尼苏达州鸟类数据集系统讲解如何用ggplot2绘制折线图、散点图与条形图并借助真实数据案例演示异常值发现、数据过滤、分组聚合与叠加比较等完整流程。学完本文你将掌握 数据 美学映射 几何对象 的 ggplot2 绘图范式能够独立对一份清洗后的数据集展开探索性可视化分析。1. ggplot2 与 Grammar of Graphics 基础ggplot2是 R 生态中最流行的可视化包之一其设计基于The Grammar of Graphics图形语法把一张统计图形拆解为比例尺scale、图层layer等有意义的构件用户只需用少量代码声明如何把变量映射到图形属性、使用哪种几何图元其余细节由ggplot2完成。用一句话概括 ggplot2 的绘图模型绘图 数据Data 美学映射Aesthetics 几何对象Geometry数据所使用的数据集dataframe美学映射研究哪些变量通常指 x 轴与 y 轴变量几何对象图的类型折线图、条形图等1.1 如何选择几何对象不同的问题对应不同的最佳图表类型本课程给出的选择原则如下分析趋势折线line、柱状column比较数值条形bar、柱状column、饼图pie、散点scatterplot展示部分与整体的关系饼图pie展示数据分布散点图scatterplot、条形图bar展示数值间的关系折线line、散点scatterplot、气泡bubble✅ 官方英文版课程3-Data-Visualization/09-visualization-quantities/README.md使用 Python 的 Matplotlib 讲解同一主题本课为其 R 语言对应版本原始教学 notebook 可参考 3-Data-Visualization/09-visualization-quantities/notebook.ipynb。2. 导入数据集并观察数据结构打开 R 控制台首先导入课程仓库根目录/data文件夹下的birds.csv。该文件带有 UTF-8 BOM 头因此读取时需要使用fileEncodingUTF-8-BOM参数避免列名出现乱码。birds - read.csv(../../data/birds.csv, fileEncodingUTF-8-BOM) head(birds)head()输出前 5 行可以看到数据是文本与数值的混合体行号NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165数据集中每条记录对应一种鸟包含分类学信息Order 目、Family 科、Genus 属、保护状态ConservationStatus以及体长、体重、翼展的最小/最大值等连续变量。仓库中该文件共 442 条鸟类记录不含表头。3. 用 geom_line 绘制翼展折线图假设我们想看这些鸟的最大翼展MaxWingspan先安装并加载ggplot2然后通过ggplot()函数声明数据与坐标映射再用geom_line()画出折线install.packages(ggplot2) library(ggplot2) ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_line()这段代码完成了三件事install.packages(ggplot2)安装包library(ggplot2)将其载入当前工作空间ggplot(databirds, aes(xName, yMaxWingspan, group1))指定数据集并把Name、MaxWingspan分别映射到 x、y 轴由于 x 轴是离散的类别变量需要group1告知 ggplot 所有点属于同一组否则折线不会连接geom_line()选择折线这一几何对象来渲染图形。第一眼你能发现什么图中至少存在一个明显的异常值outlier——翼展数值极大。2000 厘米的翼展意味着超过 20 米这显然不合理难道明尼苏达上空有翼龙在盘旋。虽然你可以在 Excel 中快速排序找出这些疑似录入错误的值但本课的目的是直接从绘图过程中推进可视化分析。3.1 为坐标轴添加标签为了让 x 轴表达讨论的是哪些鸟可以调整坐标轴文本的角度并添加轴标签与标题ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_line() theme(axis.text.x element_text(angle 45, hjust1)) xlab(Birds) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)其中theme()用于设置图形主题细节element_text(angle 45, hjust1)将 x 轴刻度文本旋转 45 度并右对齐xlab()、ylab()分别设置 x、y 轴标签ggtitle()为图形添加标题。即使把标签旋转 45 度由于鸟类种类太多x 轴标签依然难以阅读。让我们换一种策略只标注异常值并把标签直接放入图表内部。4. 改用 geom_point 散点图并标注异常值散点图能提供更多标注空间。下面用geom_point()绘制散点并通过geom_text()只对MaxWingspan 500的鸟添加名称标签同时隐藏 x 轴的刻度与标签使图形保持整洁ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_point() geom_text(aes(labelifelse(MaxWingspan500, as.character(Name),)), hjust0, vjust0) theme(axis.title.xelement_blank(), axis.text.xelement_blank(), axis.ticks.xelement_blank()) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)说明原课程代码片段中theme(...)行末尾省略了连接下一图层所需的实际运行时请补上使ylab()、ggtitle()正常生效。这里的关键点geom_point()绘制散点每个点代表一种鸟ifelse(MaxWingspan500, as.character(Name), )生成一个标签向量只有翼展超过 500 的鸟显示其名称其余为空字符串hjust0, vjust0控制标签相对数据点的水平/垂直对齐方式theme(axis.title.xelement_blank(), axis.text.xelement_blank(), axis.ticks.xelement_blank())完全隐藏 x 轴避免上百个鸟名挤成一团。你发现了什么5. 过滤异常数据subset 重建数据集图中被标注出来的 Bald Eagle白头海雕和 Prairie Falcon草原隼确实是大型猛禽但它们的最大翼展疑似被多加了一个 0——25 米的翼展显然不可能。我们创建一个剔除了这两个异常值的新数据框重新绘图birds_filtered - subset(birds, MaxWingspan 500) ggplot(databirds_filtered, aes(xName, yMaxWingspan, group1)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) geom_text(aes(labelifelse(MaxWingspan500, as.character(Name),)), hjust0, vjust0) theme(axis.text.xelement_blank(), axis.ticks.xelement_blank())这里用subset(birds, MaxWingspan 500)过滤掉翼展大于等于 500 的记录对应数据文件 data/birds.csv 中 Bald eagle 与 Prairie falcon 两行生成新数据框birds_filtered后再绘制散点图。过滤之后数据整体变得连贯、易于解读。可以从数据文件验证全表 442 条记录中恰好存在 2 条这类异常记录。提示随后的条形图练习与翼展无关你也可以选择保留这两条记录或直接修正它们翼展上的录入错误。现在数据集至少在翼展维度上是干净的我们可以进一步挖掘这些鸟的更多信息。折线图与散点图能展示数值及其分布但我们更想思考数据集中蕴含的数量问题例如这里有多少种鸟类分类Category各类数量是多少有多少鸟处于灭绝、濒危、稀有或常见状态用林奈术语Linnaeuss terminology统计各属Genus、各目Order分别有多少6. 探索条形图堆叠条形图当需要展示数据的分组情况时条形图bar chart非常实用。先基于过滤后的数据结合dplyr、tidyverse等包做分组聚合再绘制堆叠条形图install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse) birds_filtered %% group_by(Category) %% summarise(nn(), MinLength mean(MinLength), MaxLength mean(MaxLength), MinBodyMass mean(MinBodyMass), MaxBodyMass mean(MaxBodyMass), MinWingspanmean(MinWingspan), MaxWingspanmean(MaxWingspan)) %% gather(key, value, -c(Category, n)) %% ggplot(aes(x Category, y value, group key, fill key)) geom_bar(stat identity) scale_fill_manual(values c(#D62728, #FF7F0E, #8C564B,#2CA02C, #1F77B4, #9467BD)) xlab(Category) ggtitle(Birds of Minnesota)这段代码的流水线逻辑值得拆解安装并加载dplyr数据操纵/分组与tidyverse等包其中lubridate、scales分别用于日期与刻度辅助group_by(Category)按鸟类分类分组summarise(...)计算每类数量n及各数值列MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan的均值gather(key, value, -c(Category, n))把宽表转成长表——将 6 个指标列折叠为key指标名与value指标值两列供 ggplot 按指标分组填色geom_bar(statidentity)绘制条形图statidentity表示直接用数据值作为条高而非统计频数scale_fill_manual(...)手动指定 6 种指标对应的颜色xlab(Category) ggtitle(Birds of Minnesota)设置轴标签与标题。不过这张堆叠条形图因为包含了太多未分组的数据而难以阅读。更好的做法是只选择真正关心的数据来绘图。6.1 分类计数条形图coord_flip 横向展示由于分类Category众多可以把图表竖向拉伸并横向显示让所有类别标签都有空间。首先统计每个分类的鸟的数量birds_count - dplyr::count(birds_filtered, Category, sort TRUE) birds_count$Category - factor(birds_count$Category, levels birds_count$Category) ggplot(birds_count, aes(Category, n)) geom_bar(statidentity) coord_flip()要点说明dplyr::count(birds_filtered, Category, sort TRUE)统计Category列各唯一值的频数并按数量降序排列factor(birds_count$Category, levels birds_count$Category)把 Category 转换为因子并按降序后的顺序设定因子水平保证条形图按数量从多到少排列geom_bar(statidentity)用频数n作为条高coord_flip()翻转坐标轴把竖直条形图变为水平条形图。这张图清晰地呈现了每个鸟类分类的个体数量。一眼即可看出该区域数量最多的鸟类属于 Ducks/Geese/Waterfowl鸭/鹅/水禽分类——明尼苏达号称万湖之地the land of 10,000 lakes这并不令人意外。✅ 尝试在该数据集上做其他维度的计数统计有没有让你意外的发现7. 比较数据分组聚合与叠加条形图通过创建新的数据轴可以对分组数据做更多比较。先比较不同鸟类分类的 MaxLengthbirds_grouped - birds_filtered %% group_by(Category) %% summarise( MaxLength max(MaxLength, na.rm T), MinLength max(MinLength, na.rm T) ) %% arrange(Category) ggplot(birds_grouped, aes(Category, MaxLength)) geom_bar(statidentity) coord_flip()这里先把birds_filtered按Category分组用summarise()计算各类最大体长MaxLength与MinLength注意课程代码中 MinLength 同样取了 max 以保留区间上限na.rm T忽略缺失值再arrange(Category)按类别排序最后绘制横向条形图。结果并不意外蜂鸟hummingbird的 MaxLength 明显小于鹈鹕Pelican或鹅Geese。当数据符合逻辑常识时说明分析是可靠的——数据说得通就是好数据。7.1 叠加最小与最大体长更进一步可以在同一张图上叠加某个鸟类分类的最小与最大体长形成区间对比ggplot(databirds_grouped, aes(xCategory)) geom_bar(aes(yMaxLength), statidentity, positionidentity, fillblue) geom_bar(aes(yMinLength), statidentity, positionidentity, fillorange) coord_flip()两个geom_bar()分别以MaxLength、MinLength为条高并通过positionidentity让它们在原位置叠加而不做堆叠或避让从而在同一坐标系中并排展示每类的体长区间。从这张图中可以直观看出每种鸟的最小体长与最大体长区间。可以合理推断在给定数据下体型越大的鸟其体长区间越宽——这正是叠加可视化带来的洞察。8. 练习挑战与课后作业 挑战本鸟类数据集提供了特定生态系统中丰富多样的鸟类信息。请在网络上检索其他鸟类数据集围绕这些鸟类练习绘制图表去发现你此前未曾意识到的数据事实。课后作业本课作业为 Lines, Scatters and Bars——在课程中使用折线图、散点图和条形图展示了数据集的有趣事实后请进一步深挖数据集针对某一种鸟例如 Snow Goose创建一个脚本综合运用上述三种图表讲述一个完整的数据故事。评分标准Rubric要求脚本包含良好注释、扎实的叙事和美观的图表缺一项为合格缺两项则需要改进。R 版作业与 Python 版作业3-Data-Visualization/09-visualization-quantities/assignment.md要求一致仅交付物从 notebook 改为脚本。自学建议除ggplot2外R 生态中还有lattice、plotly交互式绘图等可视化方案可在课后自行探索这些包处理数据集的能力。9. 小结通过本课我们完整走通了使用 R ggplot2可视化数量quantities的标准流程读数据用read.csv(..., fileEncodingUTF-8-BOM)导入带 BOM 的 data/birds.csv画折线/散点ggplot() geom_line() / geom_point()配合theme()、xlab()、ylab()、ggtitle()完善图形表达发现并处理异常值通过subset()按MaxWingspan 500过滤疑似录入错误的数据分组聚合用dplyr的group_by()summarise()gather()完成长表转换支撑堆叠条形图计数与排序dplyr::count() 因子水平重排 coord_flip()绘制横向计数条形图叠加比较positionidentity在同一图中叠加多个几何层形成区间对比。这一套数据映射 → 几何对象 → 图层叠加 → 坐标变换的方法论正是 Grammar of Graphics 的核心价值也是后续课程分布、比例、关系等可视化主题的共同基础。相关代码与数据可直接在仓库中复现课程讲义见 3-Data-Visualization/R/09-visualization-quantities/README.mdPython 对照版见 3-Data-Visualization/09-visualization-quantities/README.md。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考