ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 R 与 ggplot2 可视化数据分布:直方图与密度图实战(Data Science for Beginners 第 10 课)

2026/9/14 17:09:27 拓冰建站 浏览量
使用 R 与 ggplot2 可视化数据分布:直方图与密度图实战(Data Science for Beginners 第 10 课) 使用 R 与 ggplot2 可视化数据分布直方图与密度图实战Data Science for Beginners 第 10 课【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners数据科学的日常工作中除了看多少数量更常需要回答如何分布distribution——数据沿坐标轴如何组织、集中在哪个区间、是否存在偏态。本课以明尼苏达州鸟类数据集data/birds.csv为例系统讲解如何用 R 的ggplot2包构建直方图histogram、2D 直方图与密度图density plot来洞察数据分布并处理文本型变量的可视化难题。读完本文你将掌握bins、adjust、alpha、fill等核心参数的实际用法并能独立完成任意数据集 → 分布探索的完整流程。前置准备加载数据并清洗异常值本课延续上一课《使用 R 与 ggplot2 可视化数量》的工作流。在上一课中我们发现Bald Eagle 与 Prairie Falcon 的MaxWingspan疑似多了一个 0属于录入错误因此先加载数据并按MaxWingspan 500过滤掉这些异常值。在 R 控制台中执行library(ggplot2) birds - read.csv(data/birds.csv, fileEncoding UTF-8-BOM) birds_filtered - subset(birds, MaxWingspan 500) head(birds_filtered)说明fileEncoding UTF-8-BOM用于正确处理带 BOM 头的 UTF-8 文件避免第一列列名出现乱码。从仓库数据文件 data/birds.csv 的原始内容可以看到文件第一行确实以 BOM 字符开头13 列分别为Name, ScientificName, Category, Order, Family, Genus, ConservationStatus, MinLength, MaxLength, MinBodyMass, MaxBodyMass, MinWingspan, MaxWingspan。过滤后的数据前几行如下法语文档与英文原版中均给出同一份示例反映的是雁鸭类水鸟的测量数据名称学名类别目科属保护状态最小体长最大体长最小体重最大体重最小翼展最大翼展黑腹树鸭Dendrocygna autumnalis鸭/鹅/水禽AnseriformesAnatidaeDendrocygnaLC475665210207694茶色树鸭Dendrocygna bicolor鸭/鹅/水禽AnseriformesAnatidaeDendrocygnaLC455371210508593雪雁Anser caerulescens鸭/鹅/水禽AnseriformesAnatidaeAnserLC647920504050135165罗斯雁Anser rossii鸭/鹅/水禽AnseriformesAnatidaeAnserLC57.36410661567113116白额雁Anser albifrons鸭/鹅/水禽AnseriformesAnatidaeAnserLC648119303310130165先用散点图初探分布为什么它不够用分布探索的直觉起点是散点图——把每个观测值按类别摊开来看。按鸟类的目Order绘制MaxLength的散点并用coord_flip()把坐标轴翻转成横向便于阅读较长的类别名ggplot(data birds_filtered, aes(x Order, y MaxLength, group 1)) geom_point() ggtitle(Max Length per order) coord_flip()这张图给出了不同目的鸟体长的大致分布轮廓但它并非展示真实分布的最优形式点的堆叠程度难以量化密集区间与稀疏区间无法用视觉精确比较。这正是直方图Histogram的用武之地——它把连续数值轴切成若干等宽区间bins用柱高表示落入每个区间的观测频数。直方图入门bins 参数如何改变解读ggplot2通过geom_histogram()提供直方图能力。它的形态类似柱状图但 x 轴是连续数值变量柱子的升起与落下直接反映数据的集中与分散。构建直方图的前提是数值型数据。对过滤后的数据绘制MaxBodyMass最大体重的分布先设定 10 个区间ggplot(data birds_filtered, aes(x MaxBodyMass)) geom_histogram(bins 10) ylab(Frequency)可以看到数据集里 400 多种鸟中的大多数其最大体重落在 2000克以下分布呈现明显的右偏长尾朝右形态。bins是直方图最关键的分辨率参数值越大柱子越细分布细节越丰富值越小曲线越平滑但可能掩盖多峰结构。把bins提高到 30ggplot(data birds_filtered, aes(x MaxBodyMass)) geom_histogram(bins 30) ylab(Frequency)粒度变细后可以观察到更多局部的起伏。若希望得到一个左侧偏斜更小、形态更规整的分布图可以进一步对数据范围做过滤——只保留体重在 160 之间的鸟仍用 30 个区间birds_filtered_1 - subset(birds_filtered, MaxBodyMass 1 MaxBodyMass 60) ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_histogram(bins 30) ylab(Frequency)✅ 动手练习尝试更换不同的过滤区间与数据点例如MinLength、MaxWingspan。若想观察数据的完整分布可去掉体重过滤直接对birds_filtered绘制带标签的分布图比较全量与局部两种视角的差异。二维直方图同时比较两个分布的关系直方图还能提供更强的颜色与标注能力。当需要比较两个分布之间的关系时可以使用geom_bin2d()构建二维直方图x 轴与 y 轴各为一个数值变量格子颜色越亮代表该区域的观测越密集。以MaxBodyMass与MaxLength为例ggplot2内置的viridis色板用更鲜艳的颜色凸显高密度收敛点ggplot(data birds_filtered_1, aes(x MaxBodyMass, y MaxLength)) geom_bin2d() scale_fill_continuous(type viridis)从图中可以看出两者沿一条预期的对角线方向存在相关性并在某个区间出现一个特别强的收敛点——体重中等偏小的鸟占据了样本的主体。二维直方图是快速判断两变量是否共同集中的有效工具。文本数据的分布以 IUCN 保护状态为例直方图默认针对数值数据效果最佳。那么面对文本型分类数据时如何考察分布鸟类数据集中还包含类别Category、属Genus、科Family以及保护状态ConservationStatus等文本信息。我们关心的问题是不同保护状态下的鸟其最小翼展分布如何首先需要理解保护状态缩写它们来自IUCN 红色名录IUCN Red List的物种状态分类CR极危Critically EndangeredEN濒危EndangeredEX灭绝ExtinctLC无危Least ConcernNT近危Near ThreatenedVU易危Vulnerable由于ConservationStatus是文本值直接作为直方图的 x 轴无法工作需要做一步重编码变换把各状态映射为有序的数值/字符标签x1x6使它们能按逻辑顺序参与绘图birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus EX] - x1 birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus CR] - x2 birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus EN] - x3 birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus NT] - x4 birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus VU] - x5 birds_filtered_1$ConservationStatus[birds_filtered_1$ConservationStatus LC] - x6接下来把MinWingspan作为 x 轴、ConservationStatus作为填充色绘制叠加直方图。这里用到三个关键参数position identity各状态的柱子不堆叠而是直接叠加便于比较形状差异alpha 0.4设置透明度避免相互遮挡时完全看不清scale_fill_manual()手动指定填充颜色与图例标签。ggplot(data birds_filtered_1, aes(x MinWingspan, fill ConservationStatus)) geom_histogram(position identity, alpha 0.4, bins 20) scale_fill_manual( name Conservation Status, values c(red, green, blue, pink), labels c(Endangered, Near Threatened, Vulnerable, Least Concern) )结果显示最小翼展与保护状态之间没有明显的相关性——不同状态类别的分布相互重叠形态接近。这是一个典型的负结果探索同样有价值它说明仅凭翼展这一维度无法区分濒危与否。你可以用同样的方法测试数据集中的其他要素如体长、体重、目或者更换不同的过滤条件看看能否发现某种关联。密度图让分布曲线流动起来细心的读者会发现此前所有直方图都是阶梯状的——柱子边缘生硬无法形成平滑的拱形轮廓。若要展示更平滑的密度形态应改用密度图density plotggplot2中对应geom_density()。先对birds_filtered_1的MinWingspan绘制密度曲线ggplot(data birds_filtered_1, aes(x MinWingspan)) geom_density()可以看到这条曲线与之前的直方图形状相呼应但变得平滑流畅。同理之前那张锯齿感较强的MaxBodyMass直方图30 bins 版本也可以用密度图重新表达得到非常光滑的形态ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_density()adjust 参数控制平滑程度密度图默认的平滑程度未必适合所有数据。若希望曲线平滑但不过度平滑可调整adjust参数——它控制核密度估计的带宽缩放倍数值越小曲线对局部细节越敏感、越显粗糙ggplot(data birds_filtered_1, aes(x MaxBodyMass)) geom_density(adjust 1/5)对比上一张图可以看出adjust 1/5保留了更多局部起伏同时整体仍比直方图平滑。✅ 动手练习查阅geom_density()的其他参数如bw、kernel、trim并逐一实验理解它们对曲线形态的影响。按分组填充一次看遍所有目的密度密度图组合能力极强——只需几行代码就能把所有目的体重密度叠加展示。给Order加上fill并设置透明度alpha 0.5各目之间的分布差异一目了然ggplot(data birds_filtered_1, aes(x MaxBodyMass, fill Order)) geom_density(alpha 0.5)这种分组密度叠加是直方图难以媲美的它既展示了每个组的分布形态又通过半透明填充保留了组间重叠信息非常适合横向比较。深入一步geom_density_2d 与自学方向密度图家族还有一个进阶成员geom_density_2d()即一维或多维的连续概率密度曲线。它在二维平面上用等高线刻画两个变量联合分布的密度可视为本文二维直方图geom_bin2d的平滑版本。建议阅读官方文档理解其工作机制并尝试与geom_point()叠加使用。 挑战直方图的行业应用调研直方图是一种比基础散点图、柱状图、折线图更进阶的图形类型。请上网搜索直方图的优秀应用案例它通常被用于哪些场景、能够证明什么问题、集中在哪些学科领域如统计学、医学检验、质量控制、影像处理等结合你找到的案例回到本数据集继续试验。复习小结本课围绕分布可视化完成了从入门到进阶的完整路线数据准备读取 data/birds.csv用subset(birds, MaxWingspan 500)剔除异常值直方图geom_histogram()bins控制粒度过滤子集改善偏态二维直方图geom_bin2d()viridis色板考察双变量收敛关系文本数据分布IUCN 状态重编码 fill/alpha/scale_fill_manual叠加直方图密度图geom_density()平滑分布adjust控制平滑程度按Order分组叠加。每次可视化前都要问自己数据是数值型还是文本型我想回答的是集中在哪里还是组间有何差异这决定了直方图、二维直方图还是密度图更合适。课后作业技能实战将本课技术迁移到新数据集从 Kaggle 等平台挑选一个你感兴趣的数据集编写 R 脚本讲述其中故事并确保至少使用 5 个直方图来发现数据事实。评分标准可参考关联作业文档 translations/fr/3-Data-Visualization/R/10-visualization-distributions/assignment.md优秀合格待改进脚本含数据集来源等完整注释且至少使用 5 个直方图发现数据事实脚本注释不完整或存在错误脚本无注释且包含错误相关资源本课配套 Python 版本见 3-Data-Visualization/10-visualization-distributions/README.md上一课《可视化数量》见 3-Data-Visualization/R/09-visualization-quantities/README.md英文原版分布课文档见 3-Data-Visualization/R/10-visualization-distributions/README.md。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考