尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

使用 R 与 ggplot2 可视化数量数据:基于 Data-Science-For-Beginners 鸟类数据集的完整实战指南

使用 R 与 ggplot2 可视化数量数据:基于 Data-Science-For-Beginners 鸟类数据集的完整实战指南 使用 R 与 ggplot2 可视化数量数据基于 Data-Science-For-Beginners 鸟类数据集的完整实战指南【免费下载链接】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 课程中 Visualizing Quantities 一课为骨架围绕 鸟类数据集明尼苏达州 443 种鸟类记录展开系统讲解如何用 R 生态中最流行的可视化包ggplot2绘制线图line plot、散点图scatter plot与柱状图bar chart并完整覆盖数据清洗异常值过滤、数据分组汇总、排序因子化与叠加对比等实战技巧。读完本文你将掌握数据 美学 几何三层绘图思维能够独立对任意数量型数据集完成从导入、探查、清洗到多角度可视化的完整流程。从零认识 ggplot2声明式绘图的 Grammar of Graphicsggplot2是一个基于The Grammar of Graphics图形语法的声明式绘图系统它把一张图表拆解为语义组件如比例尺、图层让用户只需告诉它变量如何映射到美学属性、使用哪种图形元素其余渲染细节由库自动处理。这种以少量代码绘制单变量或多变量图表的能力使其成为 R 中最受欢迎的可视化包。在 ggplot2 的思维模型中任何图表都可以浓缩为一个公式Plot Data Aesthetics GeometryData数据数据集本身即你的 dataframeAesthetics美学指定要研究的变量即 x 轴与 y 轴变量Geometry几何图表的类型如线图、柱状图、散点图等选择哪种几何对象geometry取决于你的数据形态和想讲述的故事分析意图推荐几何类型分析趋势线图line、柱状图column比较数值柱状图、饼图、散点图展示部分与整体的关系饼图pie展示数据分布散点图、柱状图展示数值间的关系线图、散点图、气泡图导入数据集注意 UTF-8 BOM 编码陷阱本课程的数据集存放在仓库根目录的 data 目录 下。打开 R 控制台导入并查看前五行数据birds - read.csv(../../data/birds.csv, fileEncodingUTF-8-BOM) head(birds)提示birds.csv文件带有UTF-8 BOM 头文件首字节为EF BB BF因此读取时必须显式指定fileEncodingUTF-8-BOM否则第一列列名Name会混入不可见字符导致后续按列名引用时报错。这在 Windows 下由 Excel 导出的 CSV 中尤为常见是数据清洗环节第一个值得记录的坑。数据的前几行是文本与数字的混合体包含 13 个字段名称、学名、分类Category、目Order、科Family、属Genus、保护状态ConservationStatus以及体长、体重、翼展的最小/最大值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数据集共 443 条记录含表头 444 行横跨约 60 个鸟类分类Category。字段MaxWingspan最大翼展单位厘米正是本节数量可视化探索的主角。用线图观察最大翼展第一幅 ggplot先安装并加载ggplot2然后绘制一个基本的线图纵览所有鸟类的最大翼展install.packages(ggplot2) library(ggplot2) ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_line()代码拆解ggplot(databirds, aes(xName, yMaxWingspan, group1))声明数据源为birdsx 轴映射到Namey 轴映射到MaxWingspangroup1是关键细节——它把所有离散的 x 点归入同一条线否则geom_line()无法把各点连接成一条折线geom_line()指定使用线图几何对象。第一眼就能发现异常图中出现了翼展超过 2000 厘米的记录——超过 20 米明尼苏达州显然没有翼手龙。虽然可以到 Excel 里排序找出这些离群点多半是录入时多敲了一个 0但本节的目的正是直接在图表工作流中定位并处理异常值。美化线图旋转坐标轴标签、添加轴标题原始线图的 x 轴堆满了鸟类名称几乎不可读。通过theme旋转标签、用xlab()/ylab()设置轴标题、用ggtitle()添加图表标题ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_line() theme(axis.text.x element_text(angle 45, hjust1)) xlab(Birds) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)theme(axis.text.x element_text(angle 45, hjust1))将 x 轴刻度文字旋转 45 度并右对齐hjust1减少文字重叠xlab(Birds)/ylab(Wingspan (CM))设置 x、y 轴标签ggtitle(...)设置图表标题。即便旋转 45 度数百个名称依然过于拥挤。换一个策略只标注异常值并把标签放进图表内部。改用散点图geom_point()腾出标注空间ggplot(databirds, aes(xName, yMaxWingspan, group1)) geom_point() geom_text(aes(labelifelse(MaxWingspan500, as.character(Name),)), hjust0, vjust0) theme(axis.title.xelement_blank(), axis.text.xelement_blank(), axis.ticks.xelement_blank()) ylab(Wingspan (CM)) ggtitle(Max Wingspan in Centimeters)这一步发生了什么geom_point()把线图换成散点图每个点代表一种鸟geom_text(aes(labelifelse(MaxWingspan500, as.character(Name),)), hjust0, vjust0)用条件表达式只给MaxWingspan 500的鸟标注名称其余留空hjust0, vjust0让文字从点向右上偏移避免压住点本身theme(axis.title.xelement_blank(), axis.text.xelement_blank(), axis.ticks.xelement_blank())隐藏 x 轴的标题、刻度文字与刻度线彻底清理拥挤的轴。过滤异常值subset 构建干净数据框查看散点图标注结果Bald Eagle白头海雕与 Prairie Falcon草原隼的翼展被多录了一个 0——前者MaxWingspan为 2300 厘米、后者为 1100 厘米见 data/birds.csv 中的原始记录现实中不可能存在翼展 25 米的猛禽。用subset()剔除翼展大于 500 厘米的记录生成新数据框并重新绘图birds_filtered - subset(birds, MaxWingspan 500) ggplot(databirds_filtered, aes(xName, yMaxWingspan, group1)) geom_point() ylab(Wingspan (CM)) xlab(Birds) ggtitle(Max Wingspan in Centimeters) geom_text(aes(labelifelse(MaxWingspan500, as.character(Name),)), hjust0, vjust0) theme(axis.text.xelement_blank(), axis.ticks.xelement_blank())subset(birds, MaxWingspan 500)按条件筛选行得到不含异常值的新数据框birds_filtered注意此处的geom_text条件MaxWingspan 500此时永远不会命中数据已被过滤它保留了标注异常值的语义方便日后数据更新时复用保留 x 轴标题xlab(Birds)同时隐藏刻度文字与刻度线。过滤之后数据在翼展维度上变得连贯、可读。异常值处理是数量可视化前必不可少的一步——脏数据会直接扭曲坐标轴比例尺掩盖真实分布。提出数量问题让图表回答有多少线图与散点图擅长呈现数据值及其分布但数据集还蕴含大量计数型数量问题。带着这些问题去选图表类型就是用数据讲故事数据集里有多少种鸟类分类各类分别有多少只有多少鸟是灭绝、濒危、稀有或常见的按保护状态统计按林奈分类学各个属Genus与目Order分别有多少种探索柱状图分组汇总与堆叠图柱状图适合展示分组数据。先用dplyr按Category分组对体长、体重、翼展六个数值列求均值再用tidyr::gather把宽表转成长表最后按key指标名填色绘制堆叠柱状图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::group_by(Category)summarise(...)按分类聚合同时用n()计数、用mean()计算六个数值列的均值gather(key, value, -c(Category, n))把六个均值列折叠为key指标名与value指标值两列这是把多组均值映射到同一柱状图的常用数据整形手法geom_bar(stat identity)statidentity表示直接使用y中的原始值作为柱高而不是默认的计数统计scale_fill_manual(values c(...))手动指定六种指标的颜色红、橙、棕、绿、蓝、紫让堆叠层次可区分该片段同时加载了lubridate、scales、tidyverse等辅助包用于日期处理、刻度格式化与数据操作。这个堆叠图信息量过大、几乎不可读——选择要展示的数据本身也是可视化的重要一环。收缩目标只统计每个分类的鸟类数量。分类计数dplyr::count coord_flip 绘制横向柱状图由于分类多达约 60 个竖直柱状图的 x 轴必然拥挤可以改为横向展示并让图表高度适配全部数据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)把Category转成因子并以已排序的取值顺序作为因子水平——这一步保证绘图时柱子的排列顺序与频数排序一致因子水平决定绘制顺序coord_flip()翻转坐标系把竖直柱变成横向柱。一眼即可看出该地区数量最多的鸟类分类是Ducks/Geese/Waterfowl鸭/鹅/水禽共 45 条记录。明尼苏达州号称万湖之地这一结果顺理成章。同理可对ConservationStatus、Genus、Order等列做计数继续挖掘数据。分组数据的相互比较新建轴、排序与叠加柱状图还可以通过新建轴来比较不同分组的派生指标。例如按分类比较鸟类的最大体长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()group_by(Category)summarise(MaxLength max(...), MinLength max(...))按分类取体长的最大值na.rm T在聚合前剔除缺失值arrange(Category)按分类名排序便于阅读结果符合生物学常识蜂鸟Hummingbirds的MaxLength最小而鹈鹕Pelicans与鹅Geese最大——当数据与逻辑一致时可视化就成功了一大半。更进一步可以把两个指标叠加到同一张柱状图上对比同一分类的MaxLength与MinLengthggplot(databirds_grouped, aes(xCategory)) geom_bar(aes(yMaxLength), statidentity, positionidentity, fillblue) geom_bar(aes(yMinLength), statidentity, positionidentity, fillorange) coord_flip()两个geom_bar叠加在同一 x 轴上分别用fillblue与fillorange区分最大/最小体长positionidentity禁止柱体互相回避/堆叠而是按各自数值直接重叠绘制形成套柱对比效果由于MinLength始终小于等于MaxLength橙色柱会被蓝色柱部分覆盖直观呈现每个分类的体长区间跨度。挑战与延伸练习 挑战本鸟类数据集蕴含丰富信息。到互联网上寻找其他鸟类数据集用线图、散点图、柱状图组合讲述一个你此前不了解的事实。课后延伸本节是使用ggplot2可视化数量的入门。可以进一步研究其他可视化路线Lattice擅长网格化多面板绘图Plotly则提供交互式图表能力均适合作为ggplot2的互补工具。配套作业本课的练习 Linjer, Spredningsdiagrammer og Søjlediagrammer英文原版见 assignment.md要求你深入该数据集用三种图表类型讲述某一种鸟类的完整故事评审标准为注释良好、叙事完整、图表美观缺一项为合格、缺两项需改进。小结围绕 Data-Science-For-Beginners 的 Visualizing Quantities 课程本文完整走通了 R ggplot2的数量可视化工作流数据导入用fileEncodingUTF-8-BOM安全读取带 BOM 的 birds.csv图形语法牢记Plot Data Aesthetics Geometry按分析意图挑选几何对象趋势→线图、比较→柱图/散点图、分布→散点图/柱图线图与散点图通过theme、xlab/ylab/ggtitle、geom_text标注与隐藏轴元素让图表可读异常值治理用subset()剔除脏数据避免比例尺失真计数与聚合dplyr::count、group_by summarise、gather把有多少的问题转化为柱状图coord_flip处理多分类横向布局对比与叠加factor排序保证绘制顺序positionidentity实现指标叠加对比。掌握这套流程后你可以把同样的方法迁移到任何数量型数据集快速回答有多少、谁最大、如何分布等问题让数据自己开口说话。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表