用 ggplot2 (R) 覆盖 KDE 和填充直方图

Posted

技术标签:

【中文标题】用 ggplot2 (R) 覆盖 KDE 和填充直方图【英文标题】:Overlay KDE and filled histogram with ggplot2 (R) 【发布时间】:2021-09-06 08:32:10 【问题描述】:

我是 R 的新手,我正在努力覆盖一个分为 6 个类的填充直方图和一个基于整个分布的 KDE(不是 6 个类的单个分布)。 我有这个包含 4 列(data1、data2、data3、origin)的数据集,所有数据都是连续的,origin 是我的类别(地理位置)。我可以用 6 个类绘制 data1 的直方图,但是当我添加 KDE 曲线时,它也分为 6 条曲线(每个类一个)。我想我明白当我调用 geom_density 时我必须覆盖第一个 aes 参数并创建一个新参数,但我找不到这样做的方法。

用 iris 数据集翻译我的问题,我想要 Sepal.Length 的 KDE 曲线,而不是每个物种的 KDE 曲线 Sepal.Length。这是我的代码和虹膜数据的结果。

ggplot(data=iris, aes(x=Sepal.Length, fill=Species)) + geom_histogram() + theme_minimal() + geom_density(kernel="gaussian", bw= 0.1, alpha=.3)

Example with Iris dataset

感谢您的帮助。

【问题讨论】:

【参考方案1】:

问题是直方图显示计数,它集成到总和,而密度图显示密度,集成到 1。要使两者兼容,您必须使用“计算变量”层的统计部分,可通过after_stat() 访问。您可以缩放密度以使其积分为总和,也可以缩放直方图以使其积分为 1。

将直方图缩放到密度:

library(ggplot2)
ggplot(iris, aes(Sepal.Length, fill = Species)) +
  geom_histogram(aes(y = after_stat(density)),
                 position = 'identity') +
  geom_density(bw = 0.1, alpha = 0.3)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

将密度缩放为计数。要正确执行此操作,您应该将 count 计算变量与直方图的 binwidth 参数相乘。

ggplot(iris, aes(Sepal.Length, fill = Species)) +
  geom_histogram(binwidth = 0.2, position = 'identity') +
  geom_density(aes(y = after_stat(count * 0.2)),
               bw = 0.1, alpha = 0.3)

由reprex package (v1.0.0) 于 2021 年 6 月 22 日创建

作为旁注;直方图的默认位置参数是将条形堆叠在另一个之上。设置 position = "identity" 可以防止这种情况。或者,您也可以在密度层中设置position = "stack"

编辑:抱歉,我似乎已经掩盖了“我想要 1 个 KDE 用于整个 Sepal.Length”这个问题的一部分。您必须手动设置组,如下所示:

ggplot(iris, aes(Sepal.Length, fill = Species)) +
  geom_histogram(binwidth = 0.2) +
  geom_density(bw = 0.1, alpha = 0.3, 
               aes(group = 1, y = after_stat(count * 0.2)))

【讨论】:

我已经尝试过您在直方图上获得 1 KDE 的解决方案,它工作正常!我期待稍后纠正缩放问题,但您为我提供了完整的解决方案。非常感谢您的详细解答。

以上是关于用 ggplot2 (R) 覆盖 KDE 和填充直方图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析用虚线标记进行数据填充的区域

R语言scale_colour_brewer()函数和scale_fill_brewer()函数调色板及填充ggplot2图像实战

R语言ggplot2可视化密度图(density plot)改变密度图下的填充色实战

R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(单色填充分组颜色填充)实战(dot plot)

R语言ggplot2可视化气泡图:无填充色的气泡图自定义填充色的气泡图

R语言ggplot2可视化配置多个子图中的相同分组使用相同的填充色实战