
Data-Science-For-Beginners 第 09 课作业实战用 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》课程第 09 课可视化数量 / Visualizing QuantitiesR 与 ggplot2 版本配套作业assignment的完整实战指南。作业要求读者在本课学到的线图line chart、散点图scatterplot与条形图bar chart基础上深入挖掘 明尼苏达鸟类数据集针对某一种特定鸟类发现新事实并用三种图表在脚本/notebook 中讲出一个有逻辑、有结论的数据故事。读完本文你将掌握 ggplot2 的绘图语法、离群值检测与数据过滤方法、分组计数与数据比较的条形图技巧并能够独立完成这份作业并对照评分标准自查。作业任务解读从一个具体物种出发讲故事本课作业的核心要求是不要停留在课程示例的通用图表上而是选定数据集中的某一类鸟深入挖掘其数据并用三种图表达成一个连贯的故事。原文给出的示例目标是雪雁Snow Goose——数据集中确实存在这一物种的记录Anser caerulescens属Anser属、Anatidae科、Anseriformes目。任务拆解下来包含四个可验证的要素深挖数据比课程示例更进一步围绕选定鸟类的体型、体重、翼展、分类地位等多个数值维度展开使用三种图表线图趋势/排序观察、散点图分布与离群值、条形图分组与比较各自发挥其最擅长的表达讲述故事图表之间要有递进关系——发现问题、定位离群值、清洗数据、得出结论呈现为脚本/notebook所有代码与说明组织在一个可复现的 R 脚本或 R Markdown/notebook 中并配有良好的注释。作业明确要求使用上面提到的三种图——即本课 README3-Data-Visualization/R/09-visualization-quantities/README.md中演示的geom_line()、geom_point()与geom_bar()三种几何对象。评估标准一份清晰的打分量表作业附带的评估量表Rubric给出了三个等级这也是你完成后自检的依据优秀Exemplary合格Adequate需改进Needs Improvement脚本注释良好、叙事扎实、图表吸引人脚本缺少上述三个要素之一脚本缺少上述两个要素换句话说注释annotations、叙事storytelling、图表质量attractive graphs三者缺一不可。下文将逐一给出实现这三点的具体方法。数据准备读取明尼苏达鸟类数据集本课数据存放于仓库根目录的 data/birds.csv。该文件是 CSV 格式包含 13 列Name、ScientificName、Category、Order、Family、Genus、ConservationStatus、MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan前 5 行大致如下NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspanBlack-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC475665210207694Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC455371210508593Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC647920504050135165Rosss gooseAnser rossiiAnseriformesAnatidaeAnserLC57.36410661567113116Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165在 R 控制台中按以下方式导入数据。注意数据文件带有 UTF-8 BOM 头因此需要显式指定fileEncodingUTF-8-BOM否则首列列名可能携带不可见字符birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)该表是文本与数值的混合体Name、ScientificName、Category、Order、Family、Genus、ConservationStatus为分类/文本列其余 6 列MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan为数值列长度单位为厘米cm体重单位为克g。做作业前先用str(birds)、summary(birds)检查各列类型与取值范围是保证后续图表正确的前提。ggplot2 绘图哲学Plot Data Aesthetics Geometry本课使用 R 生态中最流行的可视化包 ggplot2。ggplot2 是图形语法Grammar of Graphics的声明式实现把一张图拆解为三个语义组件✅ 图表 数据Data 美学映射Aesthetics 几何对象GeometryData要绘制的数据集Aesthetics研究的变量即 x、y 轴映射Geometry图表的类型线图、条形图等。用户只需要告诉 ggplot2把哪些变量映射到哪些美学属性、使用哪种几何对象其余绘制细节由包自动完成。选择几何对象的核心依据是数据形态与你想表达的故事分析趋势线图line、柱状图column比较数值条形图bar、柱状图、饼图、散点图展示部分与整体的关系饼图pie展示数据分布散点图、条形图展示数值间的关系线图、散点图、气泡图bubble。这份选择清单直接服务于作业的讲故事要求——先确定你想表达的事实类型再选择对应的几何对象。第一张图线图观察最大翼展先做基础安装与载入install.packages(ggplot2) library(ggplot2)用ggplot()指定数据集与 x/y 映射用geom_line()绘制线图观察每种鸟的最大翼展ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()立即会注意到至少一个明显的离群值——2000 厘米以上的翼展意味着超过 20 米现实中不可能存在于明尼苏达。虽然可以用 Excel 排序快速定位这类疑似录入错误的值但本课鼓励在绘图流程内完成排查。给线图加上可读的轴标签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)旋转xlab()/ylab()分别设置 x/y 轴标签ggtitle()设置标题。即便旋转到 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()配合ifelse(MaxWingspan 500, ...)只为翼展超过 500 厘米的鸟标注名称hjust/vjust控制标签偏移theme()隐藏 x 轴标题、刻度文字与刻度线以减少视觉噪音。结论很快浮现白头海雕Bald Eagle与草原隼Prairie Falcon的MaxWingspan疑似多打了一个 0——25 米的翼展显然不可能。这一步正是作业要求的挖掘事实的典型过程图表本身暴露了数据质量问题。清洗数据用 subset 剔除离群值建立一个不含这两个离群值的新数据框再重绘散点图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)生成新数据框birds_filtered。过滤后的数据更连贯、更易理解后续所有分析都基于这个干净的版本进行。线图和散点图擅长呈现数值与分布而作业要求进一步回答关于数量/分组的问题数据集里有几个鸟类类别各有多少种 有多少鸟属于灭绝、濒危、稀有或常见状态 按林奈分类的属与目各有多少种这些问题正是条形图的主场。第三张图条形图探索分组计数条形图适合展示数据分组。先安装并加载本课用到的数据操作包install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse)先用dplyr的管道对birds_filtered按Category分组汇总各数值列的均值再用gather()将宽表转成长表最后绘制按类别着色的条形图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)这张堆叠条形图因为混合了过多非分组数据而难以阅读——这也提示我们绘图前只选择真正关心的变量。改为按类别计数用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()统计Category的唯一值并按数量排序生成birds_count再将类别转为因子factor并保持排序层级最后用geom_bar(stat identity)绘制数值型条形图coord_flip()让条形水平排列。一眼即可看出本区域数量最多的鸟类类别是 Ducks/Geese/Waterfowl鸭/鹅/水禽。明尼苏达被称为万湖之州这个结果完全符合直觉。作业鼓励在此基础上继续尝试其他计数维度如按ConservationStatus、Genus、Order计数往往会有意外发现。深入比较分组条形图与叠加条形图条形图还能通过构造新轴对分组数据做更细致的比较。先按类别聚合MaxLength与MinLength的最大值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()结果符合生物学常识蜂鸟hummingbird的最大体长远小于鹈鹕Pelican或鹅Goose。数据符合逻辑本身就是好的信号。进一步把最小与最大体长叠加在同一类别上可以直观看到每个类别的体长区间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叠加绘制蓝色为MaxLength、橙色为MinLength重叠区域呈现两段的区间宽度。从这幅图可以安全地得出结论就本数据集而言体型越大的鸟类其体长区间通常也越大。作业实战示例以雪雁为对象组织叙事回到作业本身下面给出一个可直接参考的实现思路假设你选择雪雁 Snow Goose数据行真实存在于data/birds.csvMinLength 64、MaxLength 79、MinBodyMass 2050、MaxBodyMass 4050、MinWingspan 135、MaxWingspan 165隶属 Ducks/Geese/Waterfowl 类别。故事主线建议三图递进线图——定位用ggplot(birds, aes(x Name, y MaxWingspan, group 1)) geom_line()展示全体鸟类的翼展概况让读者看到雪雁在整个数据集中的相对位置处于中上水平散点图——聚焦与检验用geom_point()仅标注雪雁等关键物种检验是否存在数据质量问题并说明为何先绘制全貌图再聚焦单一种类是更稳妥的分析顺序条形图——横向比较将雪雁的MaxLength/MaxWingspan/MaxBodyMass与其同类别Ducks/Geese/Waterfowl其他代表物种比较得出雪雁在同类中属于中大体型、翼展突出的迁徙水禽之类的结论。关键过滤代码在birds_filtered基础上进一步筛选目标物种snow_geese - subset(birds_filtered, Name Snow goose) # 或按属筛选subset(birds_filtered, Genus Anser)结合前文的计数与比较技巧你还可以补充雪雁所在Anser属的物种数量、雪雁的ConservationStatusLC无危等维度让故事更加丰满。评分中叙事扎实的关键在于每张图都有明确的问题驱动与文字结论而不是孤立地堆砌图表。提交前自检清单对照评分量表在提交前逐项确认注释良好每个代码块上方有说明性注释关键步骤读取数据、清洗、每类图表都有文字解释其目的叙事扎实开头明确选定物种与待回答的问题三张图按全貌 → 聚焦 → 比较的逻辑递进结尾用文字总结发现的事实图表吸引人包含标题ggtitle、轴标签xlab/ylab、必要的角度旋转theme与配色scale_fill_manual避免默认输出的裸图可复现脚本按顺序运行即可复现全部图表无硬编码的中间结果。完成上述步骤后你的脚本/notebook 就同时满足了注释、叙事、图表三个维度对应评估表中的优秀Exemplary等级。若想进一步挑战可在作业基础上按课程挑战环节的要求寻找其他鸟类数据集用同样的 ggplot2 工作流线图 → 散点图 → 条形图继续练习讲故事的能力。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考