用 R 与 ggplot2 可视化数量数据:Data Science for Beginners 之明尼苏达鸟类数据集实战 📅 发布时间:2026/9/14 7:08:02 👁 浏览次数: 用 R 与 ggplot2 可视化数量数据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》课程10 周 20 课面向零基础数据科学学习者第三部分数据可视化第 9 课 R 语言版的完整技术指南。课程使用一份清洗干净的明尼苏达州鸟类数据集带领读者用 R 生态中最流行的ggplot2可视化包从折线图、散点图到柱状图一步步掌握数量quantity类数据的可视化方法。学完本篇你将理解图形语法Grammar of Graphics的核心思想、学会如何根据数据与叙事目标选择合适的几何对象Geometry、如何用dplyr做分组聚合后再绘图以及如何识别与过滤异常值最终独立完成一份有叙事、有结论的数据可视化分析。数据准备加载并检视明尼苏达鸟类数据集本课的数据集存放在仓库根目录的data文件夹中即 data/birds.csv。该文件共 443 行含表头即 442 条鸟类记录覆盖 13 个字段Name名称、ScientificName学名、Category类别、Order目、Family科、Genus属、ConservationStatus保护状态、MinLength/MaxLength最小/最大体长单位 cm、MinBodyMass/MaxBodyMass最小/最大体重单位 g、MinWingspan/MaxWingspan最小/最大翼展单位 cm。打开 R 控制台读取数据并查看前 5 行birds - read.csv(../../data/birds.csv, fileEncoding UTF-8-BOM) head(birds)技术细节fileEncoding UTF-8-BOM必不可少——本仓库的 data/birds.csv 文件首行带有 UTF-8 BOM字节序标记若不指定该参数第一列列名会带有不可见的\ufeff前缀导致后续按列名操作时匹配失败。前 5 行数据是文本与数字的混合体注意CSV 中的列名是英文的法文课程文档展示时对列头做了本地化翻译实际代码中使用的列名仍为英文例如MaxWingspan| | Name | ScientificName | Category | Order | Family | Genus | ConservationStatus | MinLength | MaxLength | MinBodyMass | MaxBodyMass | MinWingspan | MaxWingspan | | -- | ---------------------------- | ---------------------- | --------------------- | ----------- | -------- | ----------- | ------------------ | --------: | --------: | ----------: | ----------: | ----------: | ----------: | | 0 | Black-bellied whistling-duck | Dendrocygna autumnalis | Ducks/Geese/Waterfowl | Anseriformes | Anatidae | Dendrocygna | LC | 47 | 56 | 652 | 1020 | 76 | 94 | | 1 | Fulvous whistling-duck | Dendrocygna bicolor | Ducks/Geese/Waterfowl | Anseriformes | Anatidae | Dendrocygna | LC | 45 | 53 | 712 | 1050 | 85 | 93 | | 2 | Snow goose | Anser caerulescens | Ducks/Geese/Waterfowl | Anseriformes | Anatidae | Anser | LC | 64 | 79 | 2050 | 4050 | 135 | 165 | | 3 | Rosss goose | Anser rossii | Ducks/Geese/Waterfowl | Anseriformes | Anatidae | Anser | LC | 57.3 | 64 | 1066 | 1567 | 113 | 116 | | 4 | Greater white-fronted goose | Anser albifrons | Ducks/Geese/Waterfowl | Anseriformes | Anatidae | Anser | LC | 64 | 81 | 1930 | 3310 | 130 | 165 |认识 ggplot2 与图形语法Grammar of Graphicsggplot2是一款既能绘制简单图表、也能绘制复杂精致图表的优秀 R 可视化库CRAN 包。一般而言用这类库绘制数据图的过程包括找出 dataframe 中你关心的部分、对数据做必要的变换、指定 x 轴与 y 轴变量、决定要展示的图表类型最后渲染图表。ggplot2是一个基于**图形语法Grammar of Graphics**的声明式绘图系统。图形语法是数据可视化领域的一种通用方案它把一张图拆解为一系列语义化组件如比例尺 scales、图层 layers 等。正因为用少量代码就能轻松绘制单变量或多变量图表ggplot2成为 R 中最流行的可视化包。用户只需告诉ggplot2如何把变量映射到美学属性aesthetics、使用哪些图形元素剩下的工作由ggplot2完成。✅ 图形 数据 美学 几何数据Data数据集本身美学Aesthetics要研究的变量x 与 y 变量几何Geometry图表类型折线图、柱状图等如何选择几何对象图表类型应根据数据形态和你想通过图表讲述的故事来选择最合适的几何对象分析趋势折线图line、柱状图column比较数值条形图bar、柱状图column、饼图pie、散点图scatterplot展示部分与整体的关系饼图pie展示数据分布散点图scatterplot、条形图bar展示数值之间的关系折线图line、散点图scatterplot、气泡图bubble本课接下来的实践正是遵循这套选择逻辑先画折线图看整体走势发现异常值后改用散点图做标注最后用柱状图做分组比较。构建翼展折线图从全量数据发现异常值首先安装并载入ggplot2然后绘制全部鸟类的最大翼展折线图install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()这里先用install.packages(ggplot2)安装包再用library(ggplot2)将其载入工作区。绘制任意 ggplot 图表都使用ggplot()函数并通过参数指定数据集以及 x、y 变量。此处我们想画折线图因此使用geom_line()几何对象。注意group 1的用意当 x 轴是离散的分类变量鸟类名称时需要显式指定分组ggplot2才会把这些离散点按顺序连成一条连续的折线。观察这张图你立刻会发现图中出现了明显的异常值——那是一条多么惊人的翼展超过 2000 厘米的翼展意味着超过 20 米——难道明尼苏达州有翼龙出没虽然你也可以在 Excel 里快速排序找出这些大概率是录入错误的异常值但本课要求直接在图表的可视化过程中推进分析。接下来给 x 轴加上标签说明这些点分别代表哪些鸟ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line() theme(axis.text.x element_text(angle 45, hjust 1)) xlab(Birds) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)这里通过theme(axis.text.x element_text(angle 45, hjust 1))指定 x 轴刻度标签的旋转角度用xlab()与ylab()分别设置 x、y 轴标签ggtitle()为图表添加标题。即使把标签旋转到 45 度鸟类名称仍然太多、难以阅读。换一种策略只给异常值加标签并把标签直接放在图表内部。散点图可以为标签留出更多空间ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_point() geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank()) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)这里发生了什么用geom_point()绘制散点用geom_text()结合ifelse(MaxWingspan 500, as.character(Name), )只为翼展超过 500 厘米的鸟添加名称标签其余为空白hjust 0, vjust 0控制标签相对于点的对齐位置同时通过theme()隐藏 x 轴的标题、刻度文字与刻度线让图表更清爽。勘误提示原文档该代码段中theme(...)一行的末尾漏写了运算符直接照抄会导致语法错误本文已补上。这也是阅读开源课程资料时常见的坑——遇到报错先检查管道符与加号是否完整。你发现了什么两处异常值来自白头海雕Bald Eagle与草原隼Prairie Falcon。过滤数据剔除录入错误的异常值白头海雕和草原隼虽然确实是体型很大的猛禽但它们的最大翼展显然是标注错误——多写了一个 0。遇到翼展 25 米的白头海雕的概率微乎其微。创建不包含这两条异常值的新 dataframe重新绘图birds_filtered - subset(birds, MaxWingspan 500) ggplot(data birds_filtered, aes(x Name, y MaxWingspan, group 1)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )), hjust 0, vjust 0) theme(axis.text.x element_blank(), axis.ticks.x element_blank())用subset(birds, MaxWingspan 500)创建新 dataframebirds_filtered再绘制散点图。过滤掉异常值后数据变得连贯、易于理解。现在至少从翼展角度看我们拥有了一份更干净的数据集。折线图与散点图能展示数据取值与分布的信息而接下来我们要思考数据集中蕴含的数量问题。你可以创建可视化来回答以下关于数量的问题数据集里有多少种鸟类类别各类别分别有多少只有多少鸟处于灭绝、濒危、稀有或常见状态在林奈命名体系中存在多少个不同的属Genus和目Order探索柱状图dplyr 分组聚合与堆叠柱状图柱状图非常适合展示数据的分组信息。我们来探索该数据集中存在的鸟类类别看看哪一类在数量上最常见。先在过滤后的数据上绘制柱状图install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse) birds_filtered %% group_by(Category) %% summarise(n n(), MinLength mean(MinLength), MaxLength mean(MaxLength), MinBodyMass mean(MinBodyMass), MaxBodyMass mean(MaxBodyMass), MinWingspan mean(MinWingspan), MaxWingspan mean(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数据操作与 lubridate日期处理等包用于操纵与分组数据以绘制堆叠柱状图。流程拆解如下分组用group_by(Category)按鸟类类别分组聚合用summarise()计算每组的记录数n n()以及MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan六列的均值mean()重构数据用gather()把六列指标从宽表转为长表保留Category与n不变其余列合并为key/value两列这是 ggplot2 绘制分面多序列图的前提绘图ggplot(aes(x Category, y value, group key, fill key))按类别作为 x 轴、指标值作为 y 轴、指标名作为分组与填充色geom_bar(stat identity)表示直接用 y 值而非计数作为柱高scale_fill_manual()为 6 个指标指定自定义调色板最后设置轴标签与标题。然而这张柱状图因为塞入了过多未经归纳的数据而难以阅读。你需要只选择想要绘制的数据——让我们看按类别分组后鸟类的体长信息。由于类别众多可以纵向展示图表并调整其高度以容纳全部数据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(stat identity) coord_flip()先用dplyr::count(birds_filtered, Category, sort TRUE)统计Category列中每个类别的唯一值个数并降序排序存入新 dataframebirds_count随后用factor(birds_count$Category, levels birds_count$Category)把类别转换为因子并按已排序的顺序设定因子水平保证绘图时按排序后的顺序呈现最后用ggplot2绘制柱状图其中coord_flip()将柱状图旋转为水平条形图。这张柱状图清晰地展示了每个类别的鸟类数量。一眼就能看出该地区数量最多的鸟类属于**鸭/鹅/水禽Ducks/Geese/Waterfowl**类别——明尼苏达州号称万湖之州这并不令人意外✅ 挑战试着对这个数据集做其他维度的计数统计有什么让你意外的发现吗比较数据按类别聚合后的柱状图可以创建新的轴来尝试不同的分组数据比较。比如按类别比较鸟类的最大体长birds_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(stat identity) coord_flip()这里把birds_filtered按Category分组用summarise()取每组MaxLength与MinLength的最大值na.rm T忽略缺失值arrange(Category)按类别排序再绘制水平柱状图。结果毫不意外蜂鸟hummingbirds的最大体长最小鹈鹕pelicans或鹅geese最大。当数据符合逻辑直觉时往往说明分析方向是对的还可以通过叠加数据创建更有趣的柱状图。把给定鸟类类别的最小与最大体长叠加展示ggplot(data birds_grouped, aes(x Category)) geom_bar(aes(y MaxLength), stat identity, position identity, fill blue) geom_bar(aes(y MinLength), stat identity, position identity, fill orange) coord_flip()两次调用geom_bar()分别以MaxLength蓝色和MinLength橙色为柱高关键在于position identity——它告诉 ggplot2 不要把两个序列堆叠或避让而是让它们从零开始重叠绘制从而直观展示每类鸟的体长区间。挑战用其他鸟类数据集练手这份鸟类数据集蕴含着关于特定生态系统中不同鸟类的大量信息。你可以在网上寻找其他面向鸟类的数据集尝试围绕这些鸟类构建图表与图形去发现那些你此前没有意识到的有趣事实。回顾与延伸学习本课已介绍如何使用ggplot2可视化数量数据。可以进一步研究处理数据集的其他可视化方式例如使用 Lattice 与 Plotly 等其他 R 可视化包并寻找适合它们的数据集进行练习。课后作业折线图、散点图与柱状图的组合叙事本课配套作业见 translations/fr/3-Data-Visualization/R/09-visualization-quantities/assignment.md在本课中你已经用折线图、散点图和柱状图突出了这份数据集的许多有趣事实。在作业中请进一步探索数据集发掘关于某一特定鸟类类型的事实。例如编写一个脚本用上述三种图表类型可视化你能找到的关于**雪雁Snow goose**的全部有趣数据并在 notebook 中讲出一个完整的故事。评分标准提交一个注释清晰、叙事扎实、图表有吸引力的脚本Exemplary 档脚本缺少其中任意一项为 Adequate 档缺少两项及以上则为 Needs Improvement 档。配套资源速查数据文件data/birds.csv442 条明尼苏达鸟类记录13 列英文原版 R 课程3-Data-Visualization/R/09-visualization-quantities/README.md法文版作业translations/fr/3-Data-Visualization/R/09-visualization-quantities/assignment.mdPython 版本对照课程3-Data-Visualization/09-visualization-quantities/README.md本课输出图表的 PNG 原件存放于 3-Data-Visualization/R/09-visualization-quantities/images从折线图发现异常值、用散点图定位异常值、通过subset()过滤数据、用dplyr分组聚合、再以coord_flip()与position identity完成比较与叠加展示——这条完整链路正是数量数据可视化的标准工作流也是进入更复杂 R 数据可视化的坚实起点。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考