使用ggplot创建密度图并添加摘要信息

8
我有一个密度图,想要添加一些摘要信息,如在中位数处放置一条线并对90%的可信区间(第5和第95个分位数)进行阴影处理。有没有办法在ggplot中实现这个功能?
这是我想要总结的类型图:
我可以从y=0到y=density(median(x))绘制一条线,但不清楚是否可以用90%CI来着色图形。或者,我可以在密度图上方添加一个水平盒图,但不清楚如何单独旋转盒图,而不旋转密度图。
x <- as.vector(rnorm(10000))
d <- as.data.frame(x=x)
library(ggplot2)
ggplot(data = d) + theme_bw() + 
  geom_density(aes(x=x, y = ..density..), color = 'black')

alt text

3个回答

18
您可以使用geom_area()函数。首先使用density()函数明确密度。
x <- as.vector(rnorm(10000))
d <- as.data.frame(x=x)
library(ggplot2)
p <- ggplot(data = d) + theme_bw() + 
  geom_density(aes(x=x, y = ..density..), color = 'black')
# new code is below
q5 <- quantile(x,.05)
q95 <- quantile(x,.95)
medx <- median(x)
x.dens <- density(x)
df.dens <- data.frame(x = x.dens$x, y = x.dens$y)
p + geom_area(data = subset(df.dens, x >= q5 & x <= q95), 
              aes(x=x,y=y), fill = 'blue') +
    geom_vline(xintercept = medx)

alt text


@pchalansani,感谢你向我展示了这个。那正是我希望做的...现在我只需要把中位线放进去就行了。我一直试图使用geom_vline,但似乎不起作用。 - David LeBauer
@David 我更新了中位线,不确定为什么 geom_vline 对你无效。 - Prasad Chalasani
@pchalansani,感谢您帮助我推进这个项目。看起来很不错。 - David LeBauer
@pchalansani,感谢您的更新,但我遇到了一个问题,geom_vline将线条放在x = 0而不是中位数处。如果您转换x,x <- x + 10,您会发现密度移动了,但线条没有移动... - David LeBauer
@David 我看了一下geom_vline的帮助页面,似乎你需要使用xintercept...这样就可以了,我修复了代码... http://had.co.nz/ggplot2/geom_vline.html - Prasad Chalasani
@pchalansani 谢谢!我看错了,以为它说的是“拦截”。 - David LeBauer

6

我想为像我一样想要添加所有3个标准区域的人增加@Prasad Chalasani的答案。1 Std是最深的阴影,2 Std是中间的阴影,3 Std是最浅的阴影。平均值是黑线,中位数是白线。

set.seed(501) # Make random sample reproducible
x <- as.vector(rnorm(100))
d <- as.data.frame(x=x)
library(ggplot2)

p <- ggplot(data=d) +
     theme_bw() + 
     geom_density(aes(x=x, y = ..density..), color = '#619CFF')

# new code is below
q15.9 <- quantile(x, .159) # 1 Std 68.2%
q84.1 <- quantile(x, .841)
q2.3  <- quantile(x, .023) # 2 Std 95.4%
q97.7 <- quantile(x, .977)
q0.01 <- quantile(x, .001) # 3 Std 99.8%
q99.9 <- quantile(x, .999)
meanx <- mean(x)
medx  <- median(x)
x.dens  <- density(x)
df.dens <- data.frame(x=x.dens$x, y=x.dens$y)

p + geom_area(data = subset(df.dens, x >= q15.9 & x <= q84.1), # 1 Std 68.2%
              aes(x=x,y=y), fill='#619CFF', alpha=0.8) +
    geom_area(data = subset(df.dens, x >= q2.3 & x <= q97.7), # 2 Std 95.4%
              aes(x=x,y=y), fill='#619CFF', alpha=0.6) +
    geom_area(data = subset(df.dens, x >= q0.01 & x <= q99.9), # 3 Std 99.8%
              aes(x=x,y=y), fill='#619CFF', alpha=0.3) +
    geom_vline(xintercept=meanx) +
    geom_vline(xintercept=medx, color='#FFFFFF')

enter image description here


3

这个代码还可以在中位数处画一条竖直线:

ggplot(data = d) + theme_bw() + 
   geom_density(aes(x=x, y = ..density..), color = 'black') + 
   geom_line(aes(x=median(x), y=c(0,.4) ) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接