R 与 ggplot2 的“量”的可视化实战:从 Minnesotalintu数据清洗到用折线、散点、柱状图讲述数据故事(Data-Science-For-Beginners 第 09 课作业) 📅 发布时间:2026/9/14 17:48:55 👁 浏览次数: R 与 ggplot2 的“量”的可视化实战从 Minnesotalintu数据清洗到用折线、散点、柱状图讲述数据故事Data-Science-For-Beginners 第 09 课作业【免费下载链接】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 结合 R 的dplyr工作流对明尼苏达州鸟类数据集 birds.csv 依次完成折线图标注、散点图条件标签、离群值过滤、分组聚合与叠加柱状图。读完后你能独立复现课程全部代码并按照作业要求用三种图表类型为一个指定鸟类例如雪雁 Snow Goose讲述一条完整的数据故事。作业任务与评分标准原始作业文档 assignment.md 的要求芬兰语译文见 translations/fi/3-Data-Visualization/R/09-visualization-quantities/assignment.md非常具体在本课中你使用折线图line charts、散点图scatterplots和柱状图bar charts展示了该数据集中有趣的发现。在作业中你要更深入地挖掘数据集发现某个特定种类鸟类的事实。例如编写一个脚本可视化你能发现的关于雪雁Snow Geese的所有有趣数据。使用上述三种图表类型在你的 notebook 中讲述一个故事。评分标准Rubric如下优秀Exemplary合格Adequate需改进Needs Improvement脚本包含良好注释、扎实的故事讲述和美观的图表脚本缺少上述三个要素之一脚本缺少上述三个要素中的两个可以看到作业考核的不仅是能画图而是三要素的组合注释annotations 叙事storytelling 图表美观度。作业直接承接同目录下的课程 README该 README 中给出了全部可复现的 R 代码是完成作业的代码基线。数据基础birds.csv 的结构数据集 birds.csv 位于仓库data目录共 443 行1 行表头 442 条鸟类记录包含 13 列混合了文本与数值字段字段含义Name英文名文本ScientificName学名文本Category分类如 Ducks/Geese/WaterfowlOrder / Family / Genus林奈分类法中的目 / 科 / 属ConservationStatus保护状态如 LC无危MinLength / MaxLength体长范围cmMinBodyMass / MaxBodyMass体重范围gMinWingspan / MaxWingspan翼展范围cm作业指定故事主角雪雁在数据中的原始记录第 4 行为Snow goose,Anser caerulescens,Ducks/Geese/Waterfowl,Anseriformes,Anatidae,Anser,LC,64,79,2050,4050,135,165即体长 64–79 cm、体重 2050–4050 g、翼展 135–165 cm、保护状态 LC。作业要求围绕这一类鸟挖掘所有有趣数据因此理解这些列的含义是第一步。第一步导入数据并绘制基础折线图课程 README 给出的基线代码注意fileEncoding参数用于处理 CSV 的 BOM 头birds - read.csv(../../data/birds.csv, fileEncoding UTF-8-BOM) head(birds) install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()要点ggplot(data..., aes(x..., y..., group1))声明数据源与审美映射aestheticsgroup1告诉 ggplot2 所有点属于同一条线geom_line()决定几何类型geometry即折线图。ggplot2 的核心公式是Plot Data Aesthetics GeometryData 是数据集Aesthetics 是被研究的 x/y 变量Geometry 是图表类型。课程 README 还给出选型速查表分析趋势用 line/column比较数值用 bar/column/pie/scatterplot展示占比用 pie展示分布用 scatterplot/bar展示变量间关系用 line/scatterplot/bubble。第二步添加标注暴露离群值裸折线图中所有 x 轴标签挤在一起不可读。课程的做法是在theme()中旋转标签 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)此时图上会立刻暴露出一个异常高的峰翼展超过 2000 cm20 米以上的鸟课程提示这几乎肯定是录入时多打了一个 0 的脏数据并强调不要跳出 R 去 Excel 排序而应继续在图表内部工作work from within the plot。对 birds.csv 实际核验全表MaxWingspan 500的只有两条记录与课程结论完全吻合Bald eagle白头海雕MaxWingspan 2300 cm约 23 米实际约 2 米左右Prairie falcon草原隼MaxWingspan 1100 cm约 11 米实际约 1.1 米第三步改用散点图 条件标签定位异常45 度旋转的标签仍然过于拥挤课程换用第二个策略改用geom_point()散点图腾出标注空间并用geom_text()配合ifelse只给离群点加标签同时用theme()把 x 轴标题、刻度、刻度线全部置空element_blank()来降噪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)这里体现了 ggplot2 的图层叠加layer思想每个geom_*是独立图层ifelse在数据层完成条件判断非离群点的标签为空字符串。第四步过滤离群值得到一致的数据集既然两处异常大概率是多打了一个 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) theme(axis.text.x element_blank(), axis.ticks.x element_blank())过滤后数据变得cohesive and understandable内聚且可读。这一步对后续所有柱状图统计至关重要——否则极端值会拉偏组均值。第五步用柱状图回答量的问题折线与散点图展示的是数值分布而量的可视化真正要回答的是计数类问题。课程 README 列出三个典型问题共有多少类鸟每类各有多少种有多少鸟已灭绝、濒危、稀少或常见按林奈术语各属genus、各目order有多少种5.1 堆叠柱状图含均值聚合 tidyverse 长表转换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)这段代码演示了 dplyr ggplot2 的标准管道group_by(Category)分组 →summarise()计算每类的数量与六个数值列的均值 →tidyr::gather()把宽表转为长表key/value 两列→ 以fill key得到堆叠效果scale_fill_manual()指定色板。课程指出该图因混入了大量未分组数值列而难以阅读——这是信息过载的典型反例提示我们只画想表达的维度。5.2 计数横向条形图dplyr::count factor 排序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转成factor并把 level 顺序设为排序结果可保证条形按数量降序绘制coord_flip()交换坐标轴得到横向条形图避免大量长类别名互相挤压。对 birds.csv 的独立核验与图表结论一致Ducks/Geese/Waterfowl鸭雁水禽以 45 种位居第一其后是 New World warblers41 种与 Sandpipers/Allies34 种。课程调侃道明尼苏达是万湖之地水禽最多并不意外。第六步分组比较与叠加柱状图6.1 按类别比较 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()na.rm T处理缺失值arrange(Category)固定字母序。结果符合直觉蜂鸟hummingbirds的 MaxLength 最小鹈鹕与雁类最大——课程借此强调数据讲出符合逻辑的故事本身就是验证分析正确性的信号。6.2 叠加superimposeMinLength 与 MaxLengthggplot(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默认的position会让第二个图层堆叠在第一个之上而identity让两组条形从同一基线重叠绘制从而一眼看出每类鸟最小–最大体长的区间跨度。作业实战用三种图表为雪雁讲述一个故事结合数据核验完成作业雪雁篇的最小可运行脚本骨架在仓库根目录或 RStudio 项目中按实际相对路径调整read.csv路径library(ggplot2) library(dplyr) birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) birds_filtered - subset(birds, MaxWingspan 500) snow - birds_filtered %% filter(ScientificName Anser caerulescens) # 图 1折线雪雁在雁属Genus Anser中的翼展位置 ggplot(data birds_filtered %% filter(Genus Anser), aes(x Name, y MaxWingspan, group 1)) geom_line() geom_point() geom_vline(xintercept 2, linetype dashed) # 雪雁是雁属第 2 行 ggtitle(Anser genus: Max wingspan (Snow goose highlighted)) ylab(Wingspan (CM)) xlab(Species) # 图 2散点雪雁的体长-体重散点标注其坐标 ggplot(data birds_filtered, aes(x MinLength, y MinBodyMass, label ifelse(ScientificName Anser caerulescens, Name, ))) geom_point() geom_text(hjust -0.2) ggtitle(Length vs. body mass among Minnesota birds) # 图 3柱状雁属各物种 MaxWingspan 对比横向条形 anser - dplyr::count(birds_filtered %% filter(Genus Anser), Name, sort TRUE) birds_anser - birds_filtered %% filter(Genus Anser) %% group_by(Name) %% summarise(MaxWingspan max(MaxWingspan)) %% arrange(desc(MaxWingspan)) ggplot(birds_anser, aes(Name, MaxWingspan)) geom_bar(stat identity, fill steelblue) coord_flip() ggtitle(Max wingspan within genus Anser) xlab() ylab(Wingspan (CM))按数据事实这个故事可以是雪雁体长 64–79 cm、体重 2050–4050 g、翼展 135–165 cm、状态 LC与罗氏雁113–116 cm 翼展、大白额雁130–165 cm同属雁属Anser在明尼苏达 442 种鸟类、水禽类以 45 种居首的生态背景下雪雁是雁属中翼展并列第一的物种之一——恰好呼应第 5.2 节条形图里Ducks/Geese/Waterfowl 数量最多的宏观结论。脚本注释、每张图的ggtitle()与叙事性解读共同满足评分表中good annotations solid storytelling attractive graphs三个要素。小结第 09 课作业 assignment.md 的本质是把课程 README 中的技术流程整合成一个数据叙事练习核心技能链为read.csv(..., fileEncoding UTF-8-BOM)head()快速理解混合类型的 birds.csvggplot2 图层化建模aes()映射变量、geom_line()/geom_point()/geom_bar()切换几何、theme()降噪、geom_text()条件标注用subset()过滤离群值Bald eagle 2300、Prairie falcon 1100保证后续统计不被脏数据污染dplyr 管道group_by→summarise/count→arrange配合gather()长表转换与coord_flip()横向条形回答多少种、每类多少的量级问题用position identity叠加条形同时呈现区间的最小值与最大值。完成该作业后可自然过渡到课程 Review 中提到的下一步探索 Lattice、Plotly 等其他 R 可视化库或按课程 Challenge 寻找更多鸟类数据集继续练手。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考