用 R 与 ggplot2 深耕鸟类数据集:Lines, Scatters and Bars 作业实战指南
用 R 与 ggplot2 深耕鸟类数据集Lines, Scatters and Bars 作业实战指南【免费下载链接】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 课程中 3-Data-Visualization/R/09-visualization-quantities 一课的课后作业在学完折线图、散点图与条形图三种数量可视化技巧之后进一步深入明尼苏达州鸟类数据集针对某一具体鸟种挖掘事实并借助三类图形在脚本中讲出一个完整的数据故事。读完本文你将掌握用ggplot2筛选数据、标注离群点、分组汇总、叠加图层与横向条形图等一系列实操技能并清楚了解一份优秀作业的评分标准。作业目标为一个鸟种讲述数据故事作业原文translations/en/3-Data-Visualization/R/09-visualization-quantities/assignment.md的核心要求是在课堂上已经用折线图、散点图和条形图挖掘过数据集的亮点之后本次作业要深入数据集针对某一类具体鸟类挖掘一个事实。例如编写一个脚本将你能发现的关于 Snow Geese雪雁的所有有趣数据可视化出来并使用上述三种图形类型在 notebook 中构建一段叙事。换句话说作业不是简单地画三张图而是要求你完成一次完整的数据故事创作选定一个研究对象例如 Snow Geese 这类具体的鸟种或鸟群在 data/birds.csv 中找出与之相关的全部字段Name、ScientificName、Category、Order、Family、Genus、ConservationStatus以及MinLength/MaxLength、MinBodyMass/MaxBodyMass、MinWingspan/MaxWingspan六组数值指标针对这些数量型数据分别用折线图、散点图、条形图去呈现趋势、分布、对比与关系用清晰的标注annotations和富有说服力的叙事narrative把图表串成一段连贯的故事。以数据集中的 Snow goose 为例其记录为体长 64–79 cm、体重 2050–4050 g、翼展 135–165 cm见 data/birds.csv 第 4 行。你可以围绕雪雁是明尼苏达州体型最大的雁类之一这一事实展开叙事。回顾基础ggplot2 的三类数量可视化工具在动手做作业之前先回顾课程 3-Data-Visualization/R/09-visualization-quantities/README.md 中建立的 ggplot2 核心心法Plot Data Aesthetics Geometry。数据是数据集本身Aesthetics 是你想研究的变量x、y 轴Geometry 是图形的类型折线、散点、条形等。选用哪种几何对象取决于你想讲什么故事分析趋势折线图geom_line()比较数值条形图、散点图geom_bar()、geom_point()展示数据分布散点图、条形图展示数值之间的关系折线图、散点图。作业要求三种图形并用正好对应三类不同的故事折线图讲随鸟种变化的翼展走势散点图讲翼展分布与离群点条形图讲类别之间的数量对比。准备数据与运行环境课程数据集存放在仓库根目录的data文件夹中。在 R 控制台中读取并观察前几行birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)注意birds.csv带有 UTF-8 BOM因此必须像上面一样指定fileEncoding UTF-8-BOM否则首列列名可能出现乱码。该文件共 444 行、13 列记录了明尼苏达州鸟类的分类学信息与六项体型指标。首次使用需要安装并载入相关包install.packages(ggplot2) library(ggplot2)若要做分组汇总和管道操作还需准备dplyr、tidyr、tidyverse等install.packages(dplyr) install.packages(tidyverse) library(dplyr) library(tidyr) library(ggplot2)第一步用折线图观察翼展的走势与异常假设你想知道明尼苏达鸟类最大翼展的整体轮廓。课程中先以基础折线图入手ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()立刻就能发现至少一个离谱的离群点——超过 2000 cm 的翼展意味着 20 多米显然不正常。这时可以为图表补充坐标轴标签与标题并把 x 轴标签旋转 45 度以便阅读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)课程对应的改进版折线图见 MaxWingspan-lineplot-improved.pngx 轴列出鸟名y 轴为最大翼展cm图中可以清楚地看到个别异常高的尖峰——这正是折线图用于发现问题的典型场景也是你作业叙事中可以引用的素材。第二步用散点图标注离群点并定位数据错误即使标签旋转 45 度几十个鸟名依然难以阅读。课程推荐换一种策略改用散点图腾出空间只给真正异常的个体加注标签并隐藏 x 轴标签以降低视觉噪声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()仅对MaxWingspan 500的鸟显示名称并用theme()隐藏 x 轴的标题、标签与刻度线。结果MaxWingspan-scatterplot.png会让你立刻定位到两个异常大户。进一步排查后发现Bald Eagle 与 Prairie Falcon 的最大翼展多半被多加了一个0——25 米翼展的秃鹰显然不存在。过滤离群点建立干净的数据框用subset()把翼展小于 500 cm 的记录保留下来建立新的数据框birds_filtered再重新绘制散点图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) theme(axis.text.x element_blank(), axis.ticks.x element_blank())课程中的过滤后效果图见 MaxWingspan-scatterplot-improved.png数据变得紧凑可读绝大多数鸟的翼展集中在 300 cm 以下。这一步是作业叙事的关键转折——先发现问题、再清洗数据、最后展示干净结论本身就是一段完整的故事。作业小贴士折线图与散点图回答的是数值是多少、如何分布而条形图回答的是各类别有多少。接下来请围绕数量问题展开条形图叙事例如数据集中有多少种鸟类类别、各类别的数量是多少有多少鸟处于灭绝、濒危、稀有或常见状态按照林奈分类法各属与各目各有多少种第三步用条形图回答有多少的数量问题3.1 分组汇总并绘制堆叠条形图条形图适合展示数据的分组情况。课程先用dplyr按Category分组汇总六项体型指标的均值再用gather()变成长表最后以fill映射到key绘制堆叠条形图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)scale_fill_manual()为六个指标分别指定了颜色对应课程图 stacked-bar-chart.png。不过这张图信息过载、可读性较差——这也是作业中值得反思的反面教材当你想讲的不是全部指标就只挑选需要的列。3.2 用横向条形图清晰展示类别数量既然类别很多可以把条形图转为横向并适当调整画布高度。先统计各类别的记录数并按数量排序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(..., sort TRUE)得到降序计数再把Category转成与排序一致的 factorlevels birds_count$Category最后用coord_flip()把竖直条形旋转为横向条形。课程效果图见 category-length.pngx 轴为各类别数量约 0–40y 轴自上而下排列着各鸟类类别Ducks/Geese/Waterfowl 明显最多——明尼苏达州号称万湖之州这并不意外可以作为你叙事中的一句数据符合常识的佐证。作业小贴士不妨对ConservationStatus、Order、Genus等其他字段也做同样的计数统计看看有没有让你惊讶的发现。3.3 比较类别之间的最大体长换一个轴去比较分组数据基于birds_filtered按Category分组取MaxLength与MinLength的最大值再绘制横向条形图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()结果comparingdata.png符合生物常识蜂鸟的MaxLength最小鹈鹕与鹅类最大。数据符合逻辑本身就是一种可验证的结论这类情理之中的发现同样能支撑作业叙事。3.4 叠加最小/最大体长展示取值范围更有意思的做法是把两个指标叠加在同一张图中让读者一眼看到每个类别的长度区间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()两层的position都设为identity即可实现叠加而非堆叠对应课程图 superimposed-values.png。从叠加图可以看出鸟类体型越大其体长区间通常也越宽——如果你在作业中对比某类鸟的最小/最大体长叠加条形图是最直观的呈现方式。完成作业从三张图到一个故事结合以上课程技巧一份合格的作业脚本大致应包含以下环节加载与清洗read.csv(data/birds.csv, fileEncoding UTF-8-BOM)读入数据必要时用subset()过滤翼展离群点选定对象用dplyr::filter()等操作把目标鸟种如 Snow goose或目标类别提取出来也可以构造一个全数据集 vs 目标鸟种的对照折线图讲走势对目标鸟种或全部鸟种绘制geom_line()展示翼展/体长随鸟种变化的整体轮廓并指出异常值散点图讲分布用geom_point()配geom_text()标注离群点说明数据清洗的必要性条形图讲对比用group_by()summarise()汇总数量与均值配合coord_flip()绘制横向条形图把目标鸟种放入类别语境中例如Snow goose 在 Ducks/Geese/Waterfowl 类别中处于怎样的翼展水平叠加图讲区间用双geom_bar(position identity)叠加最小/最大指标展示取值范围收尾叙事用ggtitle()、xlab()、ylab()与theme()完善标注用注释R 脚本中的#注释或 notebook 中的 Markdown 单元格串联每一步的发现—疑问—验证—结论。评分标准Rubric解析作业的自我检查与互评依据如下评分表出自 translations/en/3-Data-Visualization/R/09-visualization-quantities/assignment.mdExemplary优秀Adequate合格Needs Improvement需改进脚本包含清晰的标注clear annotations、引人入胜的叙事a compelling narrative与赏心悦目的图形visually appealing graphs脚本缺少上述要素中的一项脚本缺少上述要素中的两项对照检查你的脚本清晰的标注每张图是否都有贴切的标题、坐标轴标签离群点、关键数据点是否有geom_text()标注代码与 notebook 中是否有解释为什么这样画的注释引人入胜的叙事三张图是否服务于同一个主题同一鸟种的事实挖掘图表之间是否有发现异常 → 过滤清洗 → 类别对比 → 得出区间结论的递进逻辑而不是三张彼此无关的图赏心悦目的图形是否合理使用了theme()、scale_fill_manual()、coord_flip()等美学与布局手段让图表整洁可读挑战与延伸本数据集data/birds.csv蕴含了丰富的信息值得继续深挖例如按ConservationStatus统计各保护级别的鸟种数量或按Order/Genus对比体型指标。你也可以寻找其他鸟类数据集用同样的折线 散点 条形三板斧练习可视化并把ggplot2之外的工具如 R 语言中的 Lattice、Plotly 等包纳入视野作为后续自我学习的延伸方向。参考资源课程主文档3-Data-Visualization/R/09-visualization-quantities/README.md作业原文档translations/en/3-Data-Visualization/R/09-visualization-quantities/assignment.md数据集data/birds.csv课程示例图3-Data-Visualization/R/09-visualization-quantities/images/对应 Python 版本的课程与作业3-Data-Visualization/09-visualization-quantities/README.md 与 3-Data-Visualization/09-visualization-quantities/assignment.md【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考