使用 R + ggplot2 可视化“数量”数据:Data-Science-For-Beginners 鸟类翼展实战(折线图、散点图与条形图) 📅 发布时间:2026/9/10 19:33:35 👁 浏览次数: 使用 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 课程第 9 课Visualizing Quantities的 R 语言版本3-Data-Visualization/R/09-visualization-quantities/README.md为骨架基于仓库自带的明尼苏达州鸟类数据集完整演示如何用 R 生态中最流行的可视化包ggplot2配合dplyr、tidyr等管道工具绘制并优化折线图、散点图与条形图。读完本文你将掌握“数量quantity”类数据的分析套路从识别离群点、过滤脏数据到按类别分组计数、比较与叠加数据最终能独立用 R 脚本讲述一张数据集里的“故事”。如果你更习惯 Python/Matplotlib可对照阅读对应的主课文档 3-Data-Visualization/09-visualization-quantities/README.md。本课在课程中的定位与配套资源这一课是课程第 3 部分Data Visualization的第一个 R 语言实践主题聚焦于**数量quantities**的可视化——也就是“数据集中某一数值特征有多大、有多少、如何分布”。课程在 1-Introduction/README.md 所描述的路标图Sketchnotesketchnotes/09-Visualizing-Quantities.png 中把该知识点归入“根据数据选择正确图表”的基础能力培养。数据文件data/birds.csv存放在仓库根目录的 data 文件夹下是一份已经过清洗的鸟类观测数据R 代码路径3-Data-Visualization/R/09-visualization-quantities/README.md配套练习3-Data-Visualization/R/09-visualization-quantities/assignment.md图示输出3-Data-Visualization/R/09-visualization-quantities/images。打开 R 控制台或 RStudio跟着本文逐段执行即可复现全部图表。认识数据与可视化框架birds.csv明尼苏达鸟类数据集长什么样本课的核心数据是明尼苏达州的鸟类记录包含表头外的 442 条观测每条记录给出了从目Order到属Genus的 Linnaeus 分类学信息、保护状态以及体长、体重、翼展的最小/最大值等 6 个数值维度。列结构如下与课程中head()输出一致NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspanBlack-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC475665210207694Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC455371210508593Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.36410661567113116Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165导入并查看数据前 5 行birds - read.csv(../../data/birds.csv, fileEncoding UTF-8-BOM) head(birds)注意数据集路径../../data/birds.csv是相对于本课文件夹的写法。文件实际位于仓库根目录 data/birds.csvfileEncoding UTF-8-BOM用于剥离 CSV 文件开头的 BOM 头该文件第一列Name前带 BOM 标记不加此参数首列名会变成\ufeffName。从 data/birds.csv 的源码看这份数据是纯文本 CSV列之间以逗号分隔数值列单位隐含为“厘米/克”。由于 Python 版课程同样读取该文件两套语言教程共享同一份数据这正是仓库设计上的特点——语言不同、数据一致、结论可比。ggplot2 与“图形语法”Plot Data Aesthetics Geometryggplot2是一套声明式的绘图系统理论基础是 Wilkinson 提出的 Grammar of Graphics图形语法。它将一张图拆解为若干语义组件比例尺 scale、图层 layer 等用户只需告诉ggplot2“把哪些变量映射到哪些美学属性、用哪种几何对象来画”剩下的渲染细节由包自动完成。✅Plot Data Aesthetics GeometryData数据要使用的数据集例如birdsAesthetics美学映射要研究的变量即aes(x ..., y ...)指定的横纵轴变量Geometry几何对象图表的类型如折线geom_line()、散点geom_point()、条形geom_bar()。选择哪种几何对象取决于你的数据结构和想讲述的故事。本课给出了一张选择速查表分析趋势折线line、柱状column比较数值条形bar、柱状、饼图pie、散点展示部分与整体的关系饼图展示数据分布散点图、条形图展示数值间关系折线、散点、气泡图。用最少的代码绘制单变量或多变量图形正是ggplot2成为 R 中最流行的可视化包的原因。用折线图观察鸟类的最大翼展第一步绘出所有鸟的 MaxWingspan安装并加载ggplot2后用一句ggplot()即可完成第一张折线图install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()ggplot()的第一参数是数据集aes()指定横轴Name鸟名与纵轴MaxWingspan最大翼展group 1告诉 ggplot 把所有点当作一条连续的折线来连接geom_line()负责绘制折线。立刻能注意到的问题图中存在至少一个离群点——某些鸟的翼展高达 2000 厘米也就是 20 多米仿佛明尼苏达州游荡着翼手龙。显然这些数值需要调查。虽然你可以在 Excel 里快速排序找出这些可疑数据多半是录入时多敲了一位数字但更好的方式是留在绘图工作流里用可视化的手段一边看一边处理。第二步旋转横轴标签标注坐标轴图中横轴有几百个鸟名直接展示必然重叠。可以在theme()中把 x 轴文本旋转 45 度并用xlab()/ylab()/ggtitle()补齐轴标签与标题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)这里element_text(angle 45, hjust 1)控制文本旋转角度与水平对齐方式hjust 1表示右对齐避免旋转后标签错位得到下图。即使旋转到 45 度鸟种太多依然无法逐个阅读。换一种策略只标注离群点并把标签直接放进图内。用散点图定位并标注离群点改用散点几何geom_point()能留出更多标注空间。下面这段代码把超过 500 厘米翼展的鸟名直接以文本标签画在数据点旁同时把 x 轴标签整体隐藏以“去 clutter”ggplot(data birds, aes(x Name, y MaxWingspan)) 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_text(aes(label ifelse(...)))逐点判断当MaxWingspan 500时用鸟名做标签否则留空hjust 0, vjust 0让标签从点的右下方向外偏移避免与点重叠theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank())依次隐藏 x 轴标题、刻度文本与刻度线。说明原文档该段代码在geom_text(...)前缺少行连接符会直接导致语法错误本文已将其补全为可连续执行的管道链。观察散点图可以确认离群点到底是谁。原始输出图见 MaxWingspan-scatterplot.png。过滤离群点得到更干净的数据调查发现Bald eagle白头海雕与 Prairie falcon草原隼的最大翼展疑似各被多加了一个 0。对仓库数据 data/birds.csv 做实际检查可以印证这一点Bald eagle的MaxWingspan为 2300 厘米、Prairie falcon为 1100 厘米而其余 440 条记录全部落在 500 厘米以内——即便对于大型猛禽翼展也应在 2 米上下量级。用subset()剔除这两个记录得到新数据框birds_filtered - subset(birds, MaxWingspan 500) ggplot(data birds_filtered, aes(x Name, y MaxWingspan)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) theme(axis.text.x element_blank(), axis.ticks.x element_blank())过滤后翼展分布不再被“拉平”主分布清晰可读值得一提subset(birds, MaxWingspan 500)会把 442 条记录收敛为 441 条课程中MaxWingspan 500的过滤条件恰好同时剔除上述两只鸟。若你担心某只翼展 500 的鸟被误伤也可以显式写!(Name %in% c(Bald eagle, Prairie falcon))两种写法结果一致。数据在翼展维度上干净之后下一步是把注意力转向这个数据集“有多少”类型的问题数据集里有多少种鸟类 Category各类数量是多少有多少鸟是灭绝extinct、濒危endangered、稀有rare还是常见common按 Linnaeus 分类术语各个属Genus和目Order各有多少种折线图与散点图能展示数值与分布而回答“数量/多少”需要另一类几何对象——条形图。用条形图探索鸟类类别分组当需要展示数据的分组时条形图最实用。先加载数据处理三件套并按Category分组聚合多个数值列绘制叠加条形图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)这条管道做的事情是group_by(Category)按类别分组 →summarise()对各数值列求均值 →gather()把 6 个数值列“宽转长”为key/value两列 → 交给ggplot用fill key按指标着色geom_bar(stat identity)直接以value作为条形高度而不是默认计数。scale_fill_manual中 6 个十六进制色值分别对应 6 个数值指标。输出见 stacked-bar-chart.png。这个堆叠条形图包含太多未分组的冗余数据几乎不可读——绘图前应只选择真正关心的列。分类计数count() 与 coord_flip() 的水平条形图先只关心“每个类别有多少种鸟”用dplyr::count()计数并排序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转成因子并显式指定levels保证 ggplot 按我们排序好的顺序而不是字母序绘制coord_flip()将坐标轴翻转得到水平条形图适合类别较多、名称较长的场景。课程输出图如下。一眼就能看出数量最多的类别是 Ducks/Geese/Waterfowl。对数据实际核算前几名是Ducks/Geese/Waterfowl45 种、New World warblers41 种、Sandpipers/Allies34 种、Gulls/Terns/Skimmers28 种、New World sparrows26 种。明尼苏达号称“万湖之州”鸭雁类占榜首毫不意外。✅ 试试其他列计数例如按 ConservationStatus、Order、Genus看看有没有让你意外的结果比较分组数据聚合、叠加与“越大的鸟范围越大”条形图同样适合比较不同分组的数值。下面先按Category聚合出最大翼展/体长类指标再比较各组的最大体长birds_grouped - birds_filtered %% group_by(Category) %% summarise( MaxLength max(MaxLength, na.rm TRUE), MinLength max(MinLength, na.rm TRUE) ) %% arrange(Category) ggplot(birds_grouped, aes(Category, MaxLength)) geom_bar(stat identity) coord_flip()summarise()中用max(..., na.rm TRUE)求各组最大值na.rm TRUE避免个别缺失值把整组拉成 NAarrange(Category)让分组结果有序。输出图见 comparingdata.png。结论毫不意外蜂鸟Hummingbirds的最大体长最小而鹈鹕Pelicans和雁类Geese则大得多——数据符合直觉恰好说明可视化结果可信。更进阶的技巧是叠加superimposing两组数据把同一类别的最小体长与最大体长画成两层条形直观呈现每个类别的长度范围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()都使用了position identity让橙色MinLength条形直接叠印在蓝色MaxLength条形之上而非并列堆叠于是蓝色条上露出的“橙色头”就是该类别的长度跨度由此可以得出一个相当有趣的规律鸟的体型越大其长度范围通常也越大。这正是“可视化数量”的价值——把原始表格中隐藏的数值关系变成一眼可读的图形证据。动手挑战与配套作业 Challenge本数据集只是明尼苏达鸟类生态的一角。挑战目标是在互联网上寻找其他鸟类数据集围绕这些数据练习绘制不同类型的图表看看能否发现之前不知道的事实。配套作业Lines, Scatters, and Bars完成本课配套作业 3-Data-Visualization/R/09-visualization-quantities/assignment.md任务深入挖掘birds.csv针对某一种鸟例如 Snow goose写一个 R 脚本使用折线图、散点图和条形图这三种图在 notebook 里讲一个完整的故事评分标准Exemplary优秀要求脚本具备良好注释、扎实的故事线叙事与赏心悦目的图表若缺少其中一种元素为 Adequate缺少两种及以上为 Needs Improvement。复习与自学建议本课是 R 版可视化的第一课。将 Python 主课 3-Data-Visualization/09-visualization-quantities/README.md 中的Matplotlib实现与本课的ggplot2实现对照阅读能同时理解两种语言下“数据 → 转换 → 映射 → 几何对象 → 输出”的统一流程进一步研究其他适合可视化分组数据的 R 包例如面向 R 传统绘图的lattice以及面向交互式图表可缩放、可悬停的plotly体会声明式ggplot2与命令式/交互式绘图的差异。通过本课你已经走通了 R 生态中“数量”可视化的完整闭环读入清洗过的数据 → 用折线图粗览全貌 → 用散点图定位离群点 → 用subset()清洗 → 用分组计数与水平条形图回答“有多少” → 用叠加条形图比较区间。这套方法论可复用于任何“带数值维度的分类型数据集”也是后续课程中学习分布、比例与关系可视化的共同基础。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考