ARTICLE DETAIL

资讯详情

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

使用 R 与 ggplot2 可视化数量数据:基于明尼苏达鸟类数据集的实战教程(Data-Science-For-Beginners 第 9 课)

使用 R 与 ggplot2 可视化数量数据:基于明尼苏达鸟类数据集的实战教程(Data-Science-For-Beginners 第 9 课) 使用 R 与 ggplot2 可视化数量数据基于明尼苏达鸟类数据集的实战教程Data-Science-For-Beginners 第 9 课【免费下载链接】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 课《Visualizing Quantities》R 语言版本围绕数量quantity这一概念讲解如何用 R 的ggplot2生态从零构建折线图、散点图与柱状图。你将学会导入仓库自带的清洗数据集data/birds.csv绘制并解读图表、识别异常值、用subset过滤脏数据并借助dplyr/tidyverse完成分组统计与堆叠可视化——最终形成一套探索数据 → 发现故事 → 验证结论的完整流程。1. ggplot2声明式绘图的图表语法在 R 中绘制图表的首选工具是ggplot2。它是一套**声明式declarative**的绘图系统底层遵循The Grammar of Graphics图表的语法将一张图拆解为数据 → 美学映射 → 几何对象等语义组件用户只需声明变量如何映射到美学属性、使用什么图形元素剩下的细节由ggplot2完成。正是这种用少量代码即可绘制单变量/多变量图表的易用性使其成为 R 生态中最流行的可视化包。可以把任何一张 ggplot 图理解为下面的公式✅ 图表Plot 数据Data 美学映射Aesthetics 几何对象GeometryData要使用的数据集Aesthetics需要研究的变量即 x 轴、y 轴变量通过aes()指定Geometry图表的类型折线图、柱状图、散点图等通过geom_*()系列函数指定。绘制流程可归纳为四步定位 dataframe 中目标列 → 必要时对数据做变换 → 指定 x、y 轴值 → 决定图表类型并渲染。而选择哪种几何对象取决于你的数据形态和想讲的故事分析目标推荐的几何对象图表类型分析趋势trends折线图line、柱状图column比较数值compare values柱状图bar、饼图pie、散点图scatterplot展示部分与整体的关系饼图pie展示数据分布distribution散点图scatterplot、柱状图bar展示数值间的关系relationships折线图line、散点图scatterplot、气泡图bubble2. 认识数据导入明尼苏达鸟类数据集本课使用的数据集存放在仓库根目录的data文件夹中即 data/birds.csv。文件首行带有 UTF-8 BOM 编码因此导入时需要显式指定fileEncodingUTF-8-BOM避免列名出现乱码前缀。打开 R 控制台执行birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) head(birds)head()查看前 5 行可以看到数据是文本 数字的混合结构NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165数据共包含 443 行记录涉及Name名称、ScientificName学名、Category类别、Order/Family/Genus林奈分类层级、ConservationStatus保护状态以及MinLength/MaxLength、MinBodyMass/MaxBodyMass、MinWingspan/MaxWingspan等 13 个字段非常适合用来做数量维度的可视化探索。3. 用折线图观察最大翼展第一眼就发现异常假设我们想了解这些鸟的最大翼展MaxWingspan可以先绘制一张最朴素的折线图install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()要点拆解install.packages(ggplot2)安装包library(ggplot2)将包载入当前工作区ggplot(data birds, aes(...))声明数据源与美学映射aes()中x、y分别绑定Name与MaxWingspangroup 1是绘制折线图的关键——它告诉 ggplot 所有点属于同一个分组从而按顺序连接成线geom_line()指定几何对象为折线。从图上立刻能看到一个刺眼的信息存在明显的异常值——2000 厘米的翼展意味着超过 20 米这几乎不可能是现实中的鸟类。与其用 Excel 手动排序去排查这些疑似录入错误的数值不如直接在绘图过程中定位并处理它们。3.1 旋转刻度标签改善可读性折线图的 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)theme(axis.text.x element_text(angle 45, hjust 1))旋转 x 轴刻度文本 45°hjust 1让文本右对齐避免悬空xlab()/ylab()分别设置 x 轴、y 轴标签ggtitle()为图表命名。即便如此40 个类别名称依然难以阅读。换个思路不为全部点加标签只为异常值标注。4. 用散点图定位异常值并过滤数据改用散点图geom_point()来为标签腾出空间同时仅对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(aes(label ifelse(MaxWingspan 500, as.character(Name), )))用ifelse条件表达式生成标签列——只有翼展超过 500 的鸟才显示名字其余为空字符串hjust 0、vjust 0控制标签相对锚点的对齐位置theme(axis.title.x / axis.text.x / axis.ticks.x element_blank())依次隐藏 x 轴标题、刻度文本与刻度线让图表更干净。在图中被点名的是秃鹰Bald Eagle与草原隼Prairie Falcon。对照仓库中的原始数据可以印证这一判断在 data/birds.csv 的第 211 行Bald eagle 的MaxWingspan为 2300第 249 行Prairie falcon 的MaxWingspan为 1100——两者的翼展都在尾部多录了一个 0属于典型的录入错误。4.1 用 subset 过滤异常值用subset()按条件生成新 dataframebirds_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) 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)返回所有翼展小于 500 的记录两个异常行被排除后数据的分布变得更加内聚、易于解读。有了干净的翼展数据后就可以进一步思考这个数据集中数量层面的深层问题数据集里一共有多少种鸟类类别各类数量是多少有多少鸟是灭绝、濒危、稀有或常见的按ConservationStatus统计用林奈分类术语统计各个Genus和Order分别有多少种鸟这些计数 / 分组类问题正是柱状图的用武之地。5. 用柱状图探索类别分布柱状图bar chart适用于展示分组数据。首先在过滤后的数据上按Category类别分组汇总长度、体重、翼展的平均值再借助tidyr::gather()把多列指标折叠为键值对绘制一张堆叠柱状图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)这段代码做了四件事分组与汇总group_by(Category)后summarise()计算每类鸟的个数n()以及 6 个数值列的平均值数据整形gather(key, value, -c(Category, n))把MinLength、MaxLength等 6 列指标变长为key/value两列这是堆叠图的前提绘图aes(fill key)让不同指标拥有不同颜色geom_bar(stat identity)表示直接使用y映射的数值作为柱高而非默认的计数配色与标题scale_fill_manual(values ...)手动指定 6 种颜色xlab()与ggtitle()设置轴标签与标题。这张堆叠图暴露了一个常见问题未分组信息过载的数据可读性很差。解决办法是只挑选真正想画的那一列数据。既然重点是比较各类别中的鸟类数量就先用dplyr::count()统计并排序再用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鸭类/雁类/水禽。这与明尼苏达万湖之州的地理特征完全吻合。用同样的思路在仓库数据上复现可以看到该类别共有 45 种鸟紧随其后的是 New World warblers41与 Sandpipers/Allies34——你也可以在 data/birds.csv 上尝试统计其他字段看看有没有出乎意料的结果。6. 分组数据的比较与叠加柱状图的价值不止于计数还能用来比较分组指标。试试按类别比较鸟的最大长度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()group_by(Category)summarise(...)按类别聚合出MaxLength与MinLength的最大值na.rm T忽略缺失值arrange(Category)按类别排序最后同样是geom_bar(stat identity)coord_flip()绘制横向柱状图。结果符合直觉蜂鸟hummingbirds的最大长度远小于鹈鹕Pelicans或鹅类Geese——当数据与常识一致时说明分析是可信的。6.1 叠加最小与最大长度一张图承载两个指标更进一步可以在同一个类别上叠加superimpose两组柱——分别用蓝色表示MaxLength、橙色表示MinLengthggplot(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它让第二组柱从坐标轴原点开始绘制而非默认的堆叠或并排从而与第一组柱部分重叠直观地展示每个类别最小/最大长度构成的范围带。7. 总结与课后练习7.1 知识点回顾通过本课你已经掌握了 R 可视化数量数据的完整工具箱ggplot2 三层结构ggplot()aes()数据与美学geom_*()几何对象折线图geom_line()配合theme(axis.text.x element_text(angle 45))处理拥挤标签散点图geom_point()配合geom_text()ifelse()仅标注异常值数据清洗subset()按条件过滤脏数据是绘图前的常规步骤柱状图三件套geom_bar(stat identity)、coord_flip()、因子化排序分组汇总dplyr::count()、group_by()summarise()、gather()整形以及position identity实现叠加比较。7.2 挑战练习本课的鸟类数据集蕴含了某个生态系统内不同鸟类的丰富信息。建议课后在网络上寻找其他鸟类相关的公开数据集围绕这些数据继续练习折线图、散点图与柱状图挖掘出自己之前不知道的事实。7.3 拓展阅读建议本课是ggplot2可视化数量的第一课。除ggplot2外R 生态中还有Lattice基于网格的统计绘图系统与Plotly交互式图表等包你可以进一步研究它们与ggplot2的差异并寻找适合用它们可视化的数据集。7.4 课后作业本课的配套作业见 Lines, Scatters, and Bars作业说明深入数据集围绕某一种特定鸟类例如雪雁 Snow Goose编写 R 脚本综合运用本课的折线图、散点图与柱状图讲出一个有数据支撑的故事。评估标准包括脚本是否有良好注释优秀、叙事是否完整、图表是否引人入胜——缺少其中任意一项则降档缺少两项则需改进。7.5 数据集速查字段含义示例值Name/ScientificName常用名 / 学名Snow goose / Anser caerulescensCategory生态类别Ducks/Geese/WaterfowlOrder/Family/Genus林奈分类层级Anseriformes / Anatidae / AnserConservationStatus保护状态LCMinLength/MaxLength最小 / 最大体长cm64 / 79MinBodyMass/MaxBodyMass最小 / 最大体重g2050 / 4050MinWingspan/MaxWingspan最小 / 最大翼展cm135 / 165原始数据文件位于 data/birds.csv本课英文原版文档见 3-Data-Visualization/R/09-visualization-quantities/README.md。动手在 R 控制台中复现以上全部代码是掌握 ggplot2 的最佳路径。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表