Data-Science-For-Beginners 第 9 课实战:用 R 与 ggplot2 以线图、散点图和柱状图讲述鸟类数据故事

发布时间:2026/9/10 9:42:57
Data-Science-For-Beginners 第 9 课实战:用 R 与 ggplot2 以线图、散点图和柱状图讲述鸟类数据故事 Data-Science-For-Beginners 第 9 课实战用 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 课可视化数量R 语言版的课后作业展开核心任务是在已经学会用ggplot2绘制线图line chart、散点图scatterplot和柱状图bar chart的基础上深入挖掘明尼苏达州鸟类数据集data/birds.csv针对某一特定鸟类例如雪雁 Snow Geese发现事实并用三种图表串联成一段有说服力的数据故事。读完本文你将掌握 R ggplot2从数据加载、清洗过滤、聚合统计到三种图表组合叙事的一整套实战流程并能直接套用本文的脚本模板完成自己的数据探索。作业背景用三种图表讲述一个数据故事本课作业translations/ar/3-Data-Visualization/R/09-visualization-quantities/assignment.md的原文要求是在本课中你使用线图、散点图和柱状图来展示这个数据集的有趣事实。在本次作业中请更深入地挖掘数据集去发现关于某一特定鸟类的真相。例如创建一个脚本script/笔记本notebook把你能够发现的关于雪雁Snow Geese的所有有趣数据可视化。请使用上面提到的三种图在你的笔记本中讲述一个故事。配套的教程正文位于同目录的 README.md英文原版见 3-Data-Visualization/R/09-visualization-quantities/README.md本课的 Python 版教程及参考解答则存放在 3-Data-Visualization/09-visualization-quantities/其中 solution/notebook.ipynb 是 Python 示例。作业的评估标准Rubric如下优秀Exemplary合格Adequate需改进Needs Improvement脚本/笔记本带有良好的注释、扎实的故事叙述和吸引人的图表脚本/笔记本缺少以上三个要素中的某一个脚本/笔记本缺少以上三个要素中的两个由此可见本次作业的三个评分维度是注释质量、叙事连贯性、图表美观度。下面我们先系统复习课程中用到的全部ggplot2技术再给出针对雪雁的完整作业实现方案。数据集速览明尼苏达州的鸟类数据集存储在仓库根目录的 data/birds.csv课程说明明确指出数据位于仓库根目录的/data文件夹。该文件包含 14 个字段文本类Name鸟名、ScientificName学名、Category类别、Order目、Family科、Genus属、ConservationStatus保护状态如LC表示无危数值类MinLength/MaxLength最小/最大体长厘米、MinBodyMass/MaxBodyMass最小/最大体重克、MinWingspan/MaxWingspan最小/最大翼展厘米。以作业示例指定的雪雁Snow goose为例数据集中该行的记录为NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspanSnow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165也就是说雪雁体长 64~79 厘米、体重 2050~4050 克、翼展 135~165 厘米属于鸭/鹅/水禽类Ducks/Geese/Waterfowl、雁形目Anseriformes、鸭科Anatidae、雁属Anser保护状态为无危LC。前提安装与加载 R 可视化工具链课程主线使用的可视化库是ggplot2。它是基于图形语法The Grammar of Graphics的声明式绘图系统将图表拆解为语义组件如比例尺、图层用户只需告诉它如何把变量映射到美学属性、使用哪种图形原语其余工作由库完成。用一句话概括本课的核心公式图 数据Data 美学映射Aesthetics 几何类型Geometry数据你选择的数据集dataframe美学要研究的变量即 x 轴和 y 轴变量几何图表的类型线图、柱状图等。在 R 控制台中按如下方式安装并加载install.packages(ggplot2) library(ggplot2)后续的聚合与数据整理还会用到dplyr、tidyverse、lubridate、scales等包install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse)如何选择几何类型Geometry课程给出了一张实用的选型指南请依据数据形态和要讲述的故事来选分析趋势线图line、柱状图column/bar比较数值柱状图、饼图、散点图展示部分与整体的关系饼图pie展示数据分布散点图、柱状图展示数值之间的关系线图、散点图、气泡图bubble。第一步加载数据并检查头部导入数据集并查看前 5 行。课程中使用了fileEncodingUTF-8-BOM处理带 BOM 头的 CSV本仓库的birds.csv首行确实带 BOM 头Name,...此参数可避免列名首字符乱码birds - read.csv(../../data/birds.csv, fileEncodingUTF-8-BOM) head(birds)注意教程代码中的路径../../data/birds.csv是相对于课程目录3-Data-Visualization/R/09-visualization-quantities/的写法若在仓库根目录运行请直接使用data/birds.csv。数据头部混合了文本与数值如前文表格所示。第二步线图——观察最大翼展发现异常值线图适合分析趋势和揭示数据中的异常。先绘制所有鸟类MaxWingspan的线图ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_line()这里aes()指定了 x、y 美学映射group1告诉 ggplot 所有点属于同一条折线geom_line()决定几何类型为线图。从图中立刻能发现异常某个点的翼展超过 2000 厘米超过 20 米——难道明尼苏达有翼手龙在游荡这提示我们数据可能存在录入错误多打了一个 0。与其用 Excel 排序去找异常值不如继续在图表内部完成排查。第一步是给 x 轴补上可读的标签并添加坐标轴标题和图表标题ggplot(databirds, aes(xName, yMaxWingspan, group1)) 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 轴刻度标签旋转 45 度、右对齐避免重叠xlab()/ylab()设置 x/y 轴标签ggtitle()设置图表标题。即使旋转 45 度鸟名依然太多、难以阅读。课程换了一个策略只标注异常点把标签放进图内并改用散点图释放更多标注空间ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_point() geom_text(aes(labelifelse(MaxWingspan 500, 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)技术要点拆解geom_point()绘制散点geom_text(aes(labelifelse(MaxWingspan 500, as.character(Name), )))用向量化条件ifelse只为翼展大于 500 厘米的鸟生成文字标签其余为空白hjust0, vjust0让标签以点为中心向左上偏移避免压住数据点theme(axis.title.xelement_blank(), axis.text.xelement_blank(), axis.ticks.xelement_blank())隐藏 x 轴标题、刻度文字和刻度线减少视觉噪音。第三步过滤数据——剔除异常值异常点被点名后真相浮出水面白头海雕Bald Eagle和草原隼Prairie Falcon很可能是录入时给最大翼展多加了一个 0。合理的处理方式是构建一个不含这两个异常值的子集再重新绘图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(MaxWingspan 500, as.character(Name), )), hjust0, vjust0) theme(axis.text.xelement_blank(), axis.ticks.xelement_blank())subset(birds, MaxWingspan 500)保留最大翼展小于 500 厘米的记录得到新数据框birds_filtered过滤后数据更内聚、更易读此时ifelse分支中的标签条件恒为假代码保留下来也无副作用可放心复用同一绘图模板。第四步柱状图——按类别聚合统计有了干净的数据就可以围绕数量提出更深层的问题数据集里有多少种鸟类类别各类别数量是多少有多少鸟是灭绝、濒危、稀有或常见状态在林奈分类法下各属Genus、各目Order的数量如何柱状图适合展示数据的分组聚合。先用dplyr按Category分组并汇总各数值列的均值再用gather()把多列折叠成键-值长表配合geom_bar(statidentity)绘制堆叠柱状图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(key, value, -c(Category, n))把 6 个数值列转成长表key存列名、value存数值geom_bar(stat identity)柱高直接取自数据值而不是计数scale_fill_manual(values ...)为不同指标指定 6 种区分度较高的颜色。这个图的问题正如课程指出的未分组的数据太多难以阅读。因此要收敛绘图目标——只画每类鸟有多少种。由于类别很多可以让柱状图横向排布coord_flip()并调整画布高度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的行数并按降序排列factor(birds_count$Category, levels birds_count$Category)把类别转为有序因子保证柱状图按数量从多到少绘制coord_flip()旋转坐标轴让柱子横向排列容纳更多类别标签。一眼即可看出该地区数量最多的鸟类类别是鸭/鹅/水禽Ducks/Geese/Waterfowl。这完全符合明尼苏达万湖之地land of 10,000 lakes的生态特征——也是课程鼓励你继续用其他计数维度如ConservationStatus、Genus、Order去尝试的探索方向。第五步柱状图进阶——分组比较与数据叠加除了计数还可以对聚合后的数值做跨类别比较。例如按类别比较最大体长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(stat identity) coord_flip()max(..., na.rm T)忽略缺失值取最大值arrange(Category)按类别排序让分组图表有序。结论符合直觉蜂鸟Hummingbirds的最大体长最小而鹈鹕Pelicans和鹅Geese最大——数据合理时是件好事。进一步可以用两个geom_bar()叠加展示同一类别的最小与最大体长。关键在于position identity不做堆叠、不回避重叠并用不同的fill颜色区分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()这种叠加superimpose手法可以在同一坐标轴上比较上下界是柱状图的高级用法。作业实现方案以雪雁Snow Geese为例回到作业本身下面给出一个可直接运行的完整脚本结构满足良好注释 扎实叙事 吸引人图表三个评分维度。1. 数据准备与目标物种过滤# 加载数据若在仓库根目录运行直接使用 data/birds.csv birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) # 数据清洗剔除翼展异常值多录了一个 0 的记录 birds_filtered - subset(birds, MaxWingspan 500) # 锁定故事主角雪雁Snow goose学名 Anser caerulescens snow_goose - subset(birds_filtered, grepl(Snow goose, Name))2. 用线图/散点图讲述雪雁在翼展谱系中的位置把雪雁的最大翼展165 厘米放回全量数据中对比同时用geom_text()只标注雪雁形成它与同类鸭/鹅/水禽相比处于什么量级的第一段叙事library(ggplot2) ggplot(data birds_filtered, aes(x Name, y MaxWingspan, group 1)) geom_point(color grey70) geom_point(data snow_goose, color red, size 3) geom_text(aes(label ifelse(grepl(Snow goose, Name), as.character(Name), )), hjust 0, vjust 0) ylab(Wingspan (CM)) ggtitle(Where Does the Snow Goose Rank in Max Wingspan?) theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank())3. 用柱状图讲述雪雁所属类别的生态位将雪雁所在的Ducks/Geese/Waterfowl类别与其他类别对比体长、体重、数量让故事从一只鸟上升到它所在的群体library(dplyr) library(tidyr) birds_grouped - birds_filtered %% group_by(Category) %% summarise(AvgMaxLength mean(MaxLength), AvgMaxBodyMass mean(MaxBodyMass), Count n()) %% arrange(desc(Count)) # 类别数量对比横向柱状图 ggplot(birds_grouped, aes(x reorder(Category, Count), y Count)) geom_bar(stat identity, fill #1F77B4) coord_flip() xlab(Category) ylab(Number of Species) ggtitle(Bird Species Count by Category (Minnesota))4. 叙事串联与交付建议三张图分别回答三个递进问题雪雁长什么样个体数据→ 雪雁在翼展上处于什么位置与全量比较→ 雪雁所在的类别有多庞大生态位。据此组织你的笔记本/脚本开头一段文字说明研究对象雪雁的基本事实体长 64~79 cm、体重 2050~4050 g、翼展 135~165 cm、保护状态 LC依次输出上述线图/散点图与柱状图每张图下方用 2~3 句注释点明你看到了什么、为什么重要结尾总结一句故事结论例如雪雁虽然只是 444 行数据中的一行但它所属的鸭/鹅/水禽类别却是明尼苏达最庞大的鸟类群体这与其万湖之地的湿地生态高度吻合。评分对照自查注释是否覆盖每一步的为什么叙事是否做到三张图层层递进图表是否设置了标题、坐标轴标签与合理的颜色。拓展挑战与延伸学习更换研究对象作业并不局限于雪雁可以任选一种鸟如加拿大雁、蜂鸟、鹈鹕重复上述流程比较不同物种之间的差异更换统计维度对ConservationStatus保护状态、Genus属、Order目做dplyr::count()计数看能否发现意外事实更换可视化库课程建议继续研究 Lattice 与 Plotly 等 R 可视化包用不同语法实现同一组图表跨语言对照本仓库的 Python 版课程3-Data-Visualization/09-visualization-quantities/使用 pandas matplotlib 完成同一分析solution/notebook.ipynb 提供了可对照的参考实现可用于体会 R 与 Python 在数据整理 绘图上的不同范式。通过本课的完整流程——加载数据、绘制线图发现异常、用散点图定位异常、用subset清洗数据、用dplyr聚合、用三种几何类型分层叙事——你已经掌握了用 R ggplot2把一张平凡的数据表变成有观点、有故事的可视化报告的核心能力。这正是数据科学工作中探索性数据分析EDA环节的日常缩影。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考