微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ggplot2 具有多个组且修剪 = TRUE 的密度:密度不会变为 0? 代码

如何解决ggplot2 具有多个组且修剪 = TRUE 的密度:密度不会变为 0? 代码

我正在为多个组绘制 ggplot2 密度,每个组都有不同的支持。出于这个原因,我希望密度线停在各个组的最小值/最大值处,以直观地传达支持的差异。我可以用 ggvis 做到这一点,请参阅:

enter image description here

但是,我无法用 geom_density() 很好地做到这一点:

  • 认情况下 (trim=FALSE) geom_density() 将在 0 处扩展密度的线,以便所有密度在 0 处重叠,从而难以比较支持
  • 设置 trim=TRUEgeom_density() 不会将线延伸到相应支撑之外,但会修剪甚至在 y 轴上的线。

如何用 ggvis 模拟 ggplot::geom_density 情节?

代码

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,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

reprex package (v1.0.0) 于 2021 年 3 月 31 日创建

解决方法

一种解决方法是使用基本的 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")

reprex package (v1.0.0) 于 2021 年 3 月 31 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。