如何解决ggplot2 具有多个组且修剪 = TRUE 的密度:密度不会变为 0? 代码
我正在为多个组绘制 ggplot2
密度,每个组都有不同的支持。出于这个原因,我希望密度线停在各个组的最小值/最大值处,以直观地传达支持的差异。我可以用 ggvis
做到这一点,请参阅:
但是,我无法用 geom_density()
很好地做到这一点:
- 默认情况下 (
trim=FALSE
)geom_density()
将在 0 处扩展密度的线,以便所有密度在 0 处重叠,从而难以比较支持 - 设置
trim=TRUE
、geom_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 举报,一经查实,本站将立刻删除。