ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Data Science for Beginners 第 9 课 R 实战:用 ggplot2 折线图、散点图与条形图讲一个鸟类数据故事

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本篇文章对应本仓库3-Data-Visualization/R/09-visualization-quantities课程的课后作业Assignment它要求学习者基于本仓库 data/birds.csv 明尼苏达州鸟类数据集深入挖掘某一特定鸟种的趣味事实并综合运用折线图line chart、散点图scatterplot与条形图bar chart三类图表在 R 脚本/notebook 中讲一个完整的数据故事。读完本文你将掌握ggplot2从数据加载、异常值排查到分类聚合可视化的完整操作链路并拿到一份可以直接复现、可以照抄评分标准自查的作业实现方案。一、作业任务目标用三种图讲述一个数据故事本课程在 R 版教学文档 中已经演示了如何使用ggplot2对「数量的可视化」进行探索绘制最大翼展的折线图、标注异常值的散点图以及按鸟类分类聚合的条形图。课后作业在此基础上更进一步要求学生更深入地挖掘该数据集发现关于某一特定类型鸟类的有趣事实。例如创建一个脚本可视化你能发现的关于雪雁Snow Geese的所有有趣数据并使用上述三种图表在你的 notebook 中讲一个故事。因此本作业的核心交付物是一份R 脚本或 notebook其评价要点有三个维度良好的注释good annotations每一段可视化代码都要说明「为什么这样画、发现了什么」扎实的故事线solid storytelling三张图不是孤立堆砌而是围绕同一物种逐步递进地揭示事实有吸引力的图形attractive graphs坐标轴标签、标题、配色、横排布局等细节到位。二、准备环境与数据2.1 数据文件数据集位于仓库根目录的 data/birds.csv共 443 行含表头每行是一种鸟字段包括Name、ScientificName、Category、Order、Family、Genus、ConservationStatus以及MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan等数值列。由于文件带 UTF-8 BOM 头读取时需要显式指定编码birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)查看前 5 行数据可以看到文本与数值混合的结构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注意表中第 3 行就是作业示例提到的雪雁Snow goose, Anser caerulescens它的MinWingspan为 135 cm、MaxWingspan为 165 cm体长 64–79 cm体重 2050–4050 g。这些真实数值可以成为你作业故事的事实素材。2.2 安装并加载绘图包课程使用的核心包是ggplot2其设计理念是「声明式绘图」把一张图拆解为数据Data、美学映射Aesthetics与几何对象Geometry三个语义组件。作业脚本开头建议先完成包安装与加载install.packages(ggplot2) # 折线图 / 散点图 / 条形图 install.packages(dplyr) # 数据分组与聚合 install.packages(tidyverse) # 数据整理gather 等 library(ggplot2) library(dplyr) library(tidyverse)三、第一张图折线图观察翼展数据先回答一个「数量」问题这些鸟的最大翼展MaxWingspan整体长什么样基础折线图可以直接把每个物种当作一个观测点ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()ggplot()中指定数据集与 x、y 变量geom_line()负责绘制折线。为了让图表可读需要为它添加坐标轴标签、标题并旋转 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)这幅图立即暴露了一个问题图中出现了明显异常值——某个物种的翼展竟然超过 2000 cm超过 20 米。这种数据通常是录入错误比如多打了一个 0。在作业脚本里把「发现异常值 → 追溯原因」作为故事的第一幕是很好的叙事方式。四、第二张图散点图定位并标注异常值物种名太多时即使旋转 45 度仍然难以阅读。课程的策略是改用散点图腾出空间只对MaxWingspan 500的异常点标注物种名同时隐藏 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, as.character(Name), )只对超过 500 的异常点写名字theme()里的三个element_blank()则把 x 轴标题、刻度文字与刻度线全部隐藏。结果发现异常点指向白头海雕Bald Eagle与草原隼Prairie Falcon——它们很可能被多加了一个 0。于是用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())这正是一个「数据清洗」的完整范例也是作业故事的第二幕从「看起来有条曲线」到「发现错误数据」再到「得到干净可信的分布」每一步都用图说话。五、第三张图条形图探索分类数量折线与散点适合展示数值及其分布而「数量」问题还包含分类维度例如数据集中有多少种鸟类分类Category各自数量是多少有多少鸟处于灭绝、濒危、稀有或常见状态按林奈分类法的Genus和Order各有多少种条形图Bar chart非常适合回答这类分组计数问题。课程首先演示了把MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan六个指标按Category聚合后一次性叠加成堆叠条形图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()把多个指标列转成长表geom_bar(stat identity)用数值本身作为条形高度scale_fill_manual()指定配色。这个图信息量过大、难以阅读——这本身也是一个值得写进作业的教训先想清楚要回答什么问题再选择要画的数据而不是把所有列一次性堆上去。更清晰的做法是只统计每个分类的物种数量并且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的唯一值个数并按数量降序排序把Category转成有序因子保证绘图时保持排序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()结果符合生物常识蜂鸟hummingbird的MaxLength最小鹈鹕Pelican与鹅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()使用相同的position identity让两根条形从同一个起点叠加蓝色表示最大体长、橙色表示最小体长从而在同一坐标系内呈现区间跨度。七、以雪雁为例一份作业的故事脚本参考结合课程演示与作业要求围绕雪雁Snow goose可以这样组织三张图的叙事逻辑折线图把雪雁置于全部水禽的MaxWingspan序列中展示它在整体分布中的位置165 cm 的翼展处于中等偏上水平散点图在散点图上用geom_point()高亮雪雁并标注物种名说明它的体长64–79 cm与体重2050–4050 g在Ducks/Geese/Waterfowl分类中的相对位置同时演示如何识别并剔除翼展大于 500 的异常记录条形图按Category统计数量指出雪雁所属的 Ducks/Geese/Waterfowl 是明尼苏达州最常见的鸟类分类从而把「一只鸟」的故事放大到「一个生态群」的层面。每一步都用ggtitle()点明主题、用xlab()/ylab()讲清坐标含义并在代码前用注释写清「为什么画这张图、发现了什么」即可满足评分标准中的全部三个维度。八、评分标准Rubric作业的评核表如下提交前可以对照自查优秀Exemplary合格Adequate需要改进Needs Improvement脚本注释良好、故事性强、图形有吸引力脚本缺少上述三个要素之一脚本缺少上述三个要素之二九、延伸挑战与自查清单挑战课程鼓励在完成作业后自行到公开渠道寻找其他鸟类数据集练习用本课学到的三种图表挖掘新事实自测问题试着对ConservationStatus保护状态或Order目做dplyr::count()看看是否有令你意外的结论进阶库除ggplot2外还可以尝试用 Lattice、Plotly 等 R 可视化包对同一数据集做对比实验体会不同语法的差异。最后再次强调数据读取细节务必使用fileEncoding UTF-8-BOM读取 data/birds.csv否则第一列表头会因 BOM 字符而出现异常整个作业的完整示例代码与图表输出均可对照 R 版教学文档 与其images/目录下的真实运行结果进行核验。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表