R语言 ggplot2密度与多组和修剪=真:密度不去0?

qni6mghb  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(112)

我在ggplot2中绘制多个组的密度,每个组都有不同的支持。出于这个原因,我希望密度线停在相应组的最小/最大值处,以直观地传达支持的差异。我可以用ggvis做到这一点,请参阅:
x1c 0d1x的数据
但是,我不能很好地使用geom_density()来做到这一点:

  • 默认情况下(trim=FALSEgeom_density()会将线的密度延伸到0,这样所有的密度都在0重叠,很难比较支持度
  • 设置trim=TRUEgeom_density()不会将线延伸到相应支撑之外,但会在y轴上修剪线。

如何用ggplot::geom_density模拟ggvis图?

代码

library(tidyverse)
library(ggvis)
#> 
#> Attaching package: 'ggvis'
#> The following object is masked from 'package:ggplot2':
#> 
#>     resolution
library(patchwork)

df <- tibble(x1=truncnorm::rtruncnorm(500, -1, 1),
           x2=truncnorm::rtruncnorm(500, -1.5, 1.5),
           x3=rnorm(500)) %>% 
  gather(variable, value, everything())

pl_gg_trim <- ggplot(df, aes(x=value, color=variable))+
  geom_density(trim=TRUE) +
  ggtitle("trim=TRUE: lines don't go to 0")
pl_gg_notrim <- ggplot(df, aes(x=value, color=variable))+
  geom_density()+
  ggtitle("trim=FALSE: hard to understand support of values")


pl_ggvis <- ggvis(df, ~value, fill = ~variable) %>%
  group_by(variable) %>%
  layer_densities()

#does not work with reprex: pl_ggvis

pl_gg_notrim/pl_gg_trim

字符串



创建于2021-03-31由reprex package(v1.0.0)

2hh7jdfx

2hh7jdfx1#

一种解决方法是使用基本的density函数,并将其绘制为geom_line

library(tidyverse)
library(broom)
set.seed(123)
df <- tibble(x1=truncnorm::rtruncnorm(500, -1, 1),
             x2=truncnorm::rtruncnorm(500, -1.5, 1.5),
             x3=rnorm(500)) %>% 
  pivot_longer(everything(), names_to = "variable", values_to = "value")

df %>%
  nest(data=value) %>% 
  mutate(fit=map(data, ~density(.$value)), results=map(fit, tidy)) %>% 
  unnest(results) %>% 
  ggplot(aes(x, y, color=variable)) + 
  geom_line() +
  labs(x="value", y="density")

字符串
x1c 0d1x的数据
创建于2021-03-31由reprex package(v1.0.0)

ep6jt1vc

ep6jt1vc2#

在ggplot 3.3.0(参见news)中,现在有一个新的outline.type参数,用于控制如何绘制笔划。
设置outline.type = "full"将使密度点的端点归零,但代价是x轴上现在有一条线连接两个点。

library(tidyverse)

df <- tibble(x1=truncnorm::rtruncnorm(500, -1, 1),
             x2=truncnorm::rtruncnorm(500, -1.5, 1.5),
             x3=rnorm(500)) |> 
  gather(variable, value, everything())

ggplot(df, aes(x=value, color=variable))+
  geom_density(trim=TRUE, outline.type = "full")

字符串
x1c 0d1x的数据
创建于2023-10-31使用reprex v2.0.2

相关问题