从 rstudio 校正和统一覆盖密度图中的峰值

Correcting and unifying peaks in overlay density plot from rstudio

我在比较多个密度时遇到问题,需要 R 大师的帮助。

我正在比较从 7 个不同时间段(30、45、60、90、120、180 和 240 分钟)收集的时间戳数据的密度。 我使用 ggplot2 绘制了一个覆盖 KDE 图。

下一步我要做的是将每个峰的y坐标匹配为1,并相应地调整其余的密度点。 所以基本上我会将每个 KDE 函数乘以一个常数,使每个峰值都等于 1(然后通过绘制 'matched peak KDE graph' 来可视化调整后的数据)。

我如何在 Rstudio 中执行此操作?

这有点老套,可能有更简洁的方法。我将在这里使用 iris 数据集。

library(ggplot2)
library(dplyr)

首先,构建典型的密度图:

p <- ggplot(iris, aes(x = Sepal.Length, colour = Species)) + 
  geom_density()
p

ggplot_build() 函数允许您访问地块的内部信息。

p_build <- ggplot_build(p)

在该列表中,有一个 data 对象,其中包含 geom_density() 调用产生的映射坐标。我去拿那个。

p_mod <- p_build$data[[1]]

然后我进行调整。首先我需要重新建立颜色所指的组,然后我根据需要为每种颜色重新设置 y 值:

p_modded <- p_mod %>%
  mutate(Species = case_when(colour == "#F8766D" ~ "setosa",
                             colour == "#00BA38" ~ "versicolor",
                             TRUE ~ "virginica")) %>% 
  group_by(colour) %>% 
  mutate(y = y / max(y)) %>% 
  ungroup()

现在是新图表。请注意,我不需要使用 geom_density(),因为已经计算了密度,因此我只需要使用 geom_line() 即可。

    ggplot(p_modded, aes(x = x, y = y, colour = Species)) + 
  geom_line()