ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Data Science For Beginners 第 9 课:使用 R 与 ggplot2 可视化数量(Minnesota 鸟类数据集实战)

Data Science For Beginners 第 9 课:使用 R 与 ggplot2 可视化数量(Minnesota 鸟类数据集实战) Data Science For Beginners 第 9 课使用 R 与 ggplot2 可视化数量Minnesota 鸟类数据集实战【免费下载链接】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 语言版本关联文档为 translations/bg/3-Data-Visualization/R/09-visualization-quantities/README.md与英文原版 3-Data-Visualization/R/09-visualization-quantities/README.md 内容一致编写。课程围绕数量quantity这一核心概念使用清洗后的 Minnesota 鸟类数据集手把手教你用 R 生态中最流行的可视化包ggplot2完成折线图、散点图与柱状图的实战绘制。学完本篇你将掌握数据 美学 几何的声明式绘图范式、离群值的识别与过滤、基于dplyr的分组聚合可视化以及如何用坐标翻转、数据叠加等技巧讲出清晰的数据故事。一、课程背景用 R 探索 Minnesota 的鸟类数据本课使用的数据集是仓库根目录下的 data/birds.csv它收录了 Minnesota 地区鸟类的多种属性名称、学名、分类Category、目Order、科Family、属Genus、保护状态ConservationStatus以及最小/最大体长MinLength/MaxLength、最小/最大体重MinBodyMass/MaxBodyMass、最小/最大翼展MinWingspan/MaxWingspan等数值字段。该文件共包含 444 行表头 443 条鸟类记录每个字段之间用逗号分隔首列带有 UTF-8 BOM 标记因此在 R 中读取时需要使用fileEncodingUTF-8-BOM参数。打开 R 控制台导入数据集并查看前 5 行birds - read.csv(../../data/birds.csv, fileEncodingUTF-8-BOM) head(birds)前几行数据是文本与数字的混合NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165注意原始 CSV 的表头列名为Name、MaxWingspan等R 在读取时会自动把列名规范化为MaxWingspan这种大小写形式与文档中的代码一致。在后续所有图表中这些列名都作为aes()的美学映射依据。二、ggplot2 与图形语法绘图 数据 美学 几何ggplot2是 R 中创建简单与复杂图表都极为出色的库它是一套基于图形语法The Grammar of Graphics的声明式绘图系统。所谓声明式是指你只负责描述用什么数据、怎么映射、画什么形状而把坐标刻度、图例、分面等底层细节交给ggplot2处理。图形语法把一张图拆解为语义组件如比例尺 scale、图层 layer用少量代码即可完成单变量或多变量的可视化这正是它成为 R 中最流行可视化包的原因。用一句话记忆核心公式✅ 图形Plot 数据Data 美学Aesthetics 几何Geometry数据要使用的数据集即data参数美学要研究的变量在aes()中指定 x、y 变量几何图形的类型如折线图geom_line()、柱状图geom_bar()、散点图geom_point()。根据数据形态与你想要讲述的故事选择最合适的几何类型分析趋势折线图line、柱状图column比较数值大小柱状图、柱形图、饼图、散点图展示部分与整体的关系饼图pie展示数据分布散点图、柱状图展示变量间关系折线图、散点图、气泡图。在本课随后的章节中你会看到同一份birds数据在不同几何对象下呈现出完全不同的信息层次折线图暴露离群值、散点图为标注腾出空间、柱状图用于分组计数与比较。这也是先想清楚要回答什么问题再选择几何对象这一方法论的核心体现。三、实战一用折线图观察鸟类最大翼展我们先从最基础的折线图开始可视化这些鸟类的最大翼展MaxWingspan。首先安装并加载ggplot2install.packages(ggplot2) library(ggplot2) ggplot(data birds, aes(x Name, y MaxWingspan, group 1)) geom_line()这里install.packages(ggplot2)完成安装library(ggplot2)将其导入当前工作环境。ggplot()函数接收三个关键属性数据集data、x 轴变量Name、y 轴变量MaxWingspan。因为 x 轴是离散的鸟类名称而非连续数值需要额外传入group 1告诉 ggplot 把所有点连成一条折线geom_line()则负责把映射好的数据绘制为折线图。图一出现就暴露出一个明显的离群值outlier某个点的翼展超过了 2000 厘米——那可是 20 多米难道 Minnesota 上空有翼龙在翱翔虽然你也可以在 Excel 里快速排序找出这些疑似录入错误的数据但本课的目标是训练直接在图中发现问题的可视化思维。3.1 添加坐标轴标签并旋转刻度文字为了让折线图更易读我们给 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)theme(axis.text.x element_text(angle 45, hjust 1))在theme中指定 x 轴刻度文字旋转 45 度hjust 1让文字右对齐锚点xlab()/ylab()分别设置 x、y 轴标签ggtitle()为图形命名。即便旋转了标签鸟类种类太多依然难以辨认。这时我们换一种策略只标注离群值并把标签画在图表内部。散点图比折线图留有更多标注空间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)说明原文档代码片段中theme(...)之后的ylab()、ggtitle()需要以连接此处已调整为可复制运行的完整写法。这段代码做了三件事geom_point()把每个数据点绘制为散点geom_text(aes(label ifelse(MaxWingspan 500, as.character(Name), )))只为MaxWingspan 500的鸟添加名称标签其余为空字符串hjust 0, vjust 0控制标签相对数据点的对齐方向theme(axis.title.x element_blank(), axis.text.x element_blank(), axis.ticks.x element_blank())隐藏 x 轴标题、刻度文字与刻度线大幅减少视觉干扰。四、过滤数据剔除离群值得到干净数据集散点图揭开了离群值的真面目**Bald Eagle白头海雕**和 **Prairie Falcon草原隼**虽然确实是大型猛禽但它们的最大翼展被错误地多敲了一个 0——你不太可能在 Minnesota 遇到翼展 25 米的白头海雕。正确做法是创建一个不含这两个异常点的新数据框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随后在其上重新绘制散点图。注意此时MaxWingspan 500的标注条件虽然保留了但由于数据已过滤不会再产生任何离群标签。过滤掉异常值后数据整体更连贯、更易于理解——这正是数据准备data preparation在可视化环节的价值体现。得到至少翼展维度上是干净的数据集后我们可以进一步回答关于数量的一系列问题这个数据集中有多少种鸟类分类Category各自数量是多少 有多少鸟是灭绝、濒危、稀有或常见的 按照林奈分类法各属Genus和各目Order分别有多少种这些问题正是数量可视化的切入点而回答它们最合适的几何对象就是柱状图。五、实战二柱状图探索鸟类分类数量柱状图非常适合展示分组数据。为了绘制更复杂的聚合柱状图先安装并加载数据处理与可视化所需的一批包install.packages(dplyr) install.packages(tidyverse) library(lubridate) library(scales) library(dplyr) library(ggplot2) library(tidyverse)其中dplyr负责数据操纵与分组lubridate处理时间类数据本课中主要用于加载依赖tidyverse则聚合了数据处理与可视化的整套生态。接下来按鸟类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)关键点拆解group_by(Category)按鸟类分类分组summarise(n n(), ...)在每组内统计样本数n并计算六个数值列MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan的均值gather(key, value, -c(Category, n))将六个指标列折叠为key指标名与value数值两列使每个指标都能作为独立的分组填充维度geom_bar(stat identity)表示直接使用y提供的数值高度而非统计频数scale_fill_manual()为六类指标手动指定了颜色#D62728红、#FF7F0E橙、#8C564B棕、#2CA02C绿、#1F77B4蓝、#9467BD紫。这张堆叠柱状图信息量很大但正因堆叠了太多未分组的数据而难以阅读。更好的做法是只选择你真正关心的维度——比如先看每种分类下的鸟类数量。由于分类很多可以把图表旋转为横向并调整高度以容纳全部数据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列的每个唯一值出现次数并按数量降序排序生成新数据框birds_countfactor(birds_count$Category, levels birds_count$Category)把分类列转换为**因子factor**并固定其水平顺序确保柱状图按已排序的顺序绘制geom_bar(stat identity)用n列作为柱高coord_flip()翻转坐标系把竖直柱状图变为水平条形图更利于阅读较长的分类名称。一眼就能看出Minnesota 地区数量最多的鸟类分类是Ducks/Geese/Waterfowl鸭/鹅/水禽。这并不意外——Minnesota 被称为万湖之地land of 10,000 lakes水禽丰富实属理所当然。你也可以在这个数据集上尝试其他维度的计数比如按Order或ConservationStatus计数看看有没有出乎意料的结果。六、实战三分组数据比较与数据叠加柱状图的另一个常见用途是比较不同分组的数值。通过创建新的坐标轴可以对分组数据做各种比较。例如比较每种分类下鸟类的最大体长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()这段代码先把birds_filtered按Category分组用max(..., na.rm T)分别求每组内MaxLength与MinLength的最大值na.rm T表示计算时忽略缺失值再用arrange(Category)排序最后绘制水平柱状图。结果符合生物学直觉蜂鸟Hummingbirds的最大体长在所有分类中最短而鹈鹕Pelicans和鹅Geese则长得多。当数据能给出符合逻辑的结论时说明可视化在正确传递信息。更进阶的玩法是在同一张图中叠加两层数据。下面把每种鸟类分类的MinLength与MaxLength同时绘制出来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()都使用stat identity与position identity前者直接用y美学提供的数值作为柱高后者禁止 ggplot 对柱体做避让dodge或堆叠stack于是蓝色MaxLength与橙色MinLength两组柱体从同一起点出发、相互叠压直观呈现每组数据的最小—最大跨度。七、挑战任务与配套作业 挑战birds.csv数据集蕴含了特定生态系统中丰富多样的鸟类信息。你可以在网络上寻找其他鸟类相关的数据集用本课学到的图表技能去探索挖掘那些你原本没有意识到的有趣事实。 作业Lines, Scatters and Bars本课作业详见 3-Data-Visualization/R/09-visualization-quantities/assignment.md。任务要求深入研究数据集发掘某一种鸟类例如Snow Goose 雪雁的有趣事实并编写一个脚本综合运用本课提到的折线图、散点图、柱状图三种图表在 notebook 中讲出一个完整的数据故事。评分标准分为三档优秀Exemplary合格Adequate待改进Needs Improvement脚本带有良好的注释、扎实的故事叙述和赏心悦目的图形脚本缺少上述三要素之一脚本缺少上述三要素中的两个八、自主延伸学习本课是 ggplot2 数量可视化系列的第一课核心收获是掌握用ggplot2可视化数量的完整流程识别数据框中的目标部分 → 执行必要的数据变换 → 指定 x/y 轴 → 选择几何对象 → 渲染图形。后续可以进一步研究其他 R 可视化扩展包Lattice基于 Trellis 网格的经典绘图包擅长条件分面图facetPlotlyplotly.R把 ggplot 图形升级为可交互的 Web 图表。更系统的学习路径是继续本仓库 R 系列课程的后续章节3-Data-Visualization/R/10-visualization-distributions、11-visualization-proportions、12-visualization-relationships 与 13-meaningful-vizualizations它们分别围绕分布、比例、关系与有意义的可视化展开共同构成完整的数据可视化知识体系。动手运行每一段代码观察参数变化对图形的实际影响是内化这些技巧最有效的方式。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表