Добавление сводной информации в график плотности, созданный с помощью ggplot - PullRequest
7 голосов
/ 28 декабря 2010

У меня есть график плотности, и я хотел бы добавить некоторую сводную информацию, такую ​​как размещение линии по медиане и закрашивание 90% вероятных интервалов (5-й и 95-й квантили). Есть ли способ сделать это в ggplot?

Это тип сюжета, который я хотел бы обобщить:

Я могу понять, как нарисовать линию от y = 0 до y = плотности (медиана (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 ]

16 голосов
/ 28 декабря 2010

Вы можете использовать функцию 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

4 голосов
/ 07 апреля 2017

Я хотел бы добавить к ответу @Prasad Chalasani тех, кто, как и я, которые хотели добавить все 3 области.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 голосов
/ 28 декабря 2010

Это (также) делает вертикальную линию на медиане:

ggplot(data = d) + theme_bw() + 
   geom_density(aes(x=x, y = ..density..), color = 'black') + 
   geom_line(aes(x=median(x), y=c(0,.4) ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...