ggplot2: межквартильный диапазон для каждой группы - PullRequest
2 голосов
/ 11 марта 2020

Основываясь на , мне интересно, как я могу визуализировать межквартильный диапазон для каждой группы (Тип), где плотности каждой группы представлены в виде одной большой цифры, как показано ниже:

Click here to see the picture

На этом текущем рисунке точки представляют значения x, соответствующие максимальному значению y, где минимальные / максимальные значения серой линии представляют 2,5% и 97,5% с каждой группы.

Здесь на каждом графике у меня есть три точки, которые являются максимумами в трех группах.

ОДНАКО, мне нужно иметь только одну точку (одно значение x) для каждой группы, и я заблудился отсюда.

Пожалуйста, помогите мне!

На всякий случай я приложил код, который может воспроизвести фигуру.

my_data <- data.frame(mean = c(0.04, 0.015, -0.04),
                      stdev = c(0.019,  0.019, 0.02), 
                      Type = factor(c("A", 
                                      "B",
                                      "C")))
# points at which to evaluate the Gaussian densities
x <- seq(-0.1, 0.1, by = 0.001)

# build list of Gaussian density vectors based on means and standard deviations
pdfs <- mapply(dnorm, mean = my_data$mean, sd = my_data$stdev, MoreArgs = list(x = x),
               SIMPLIFY = FALSE)

# add group names
names(pdfs) <- my_data$Type

# convert list to dataframe
pdfs <- do.call(cbind.data.frame, pdfs)

# Summary stat
x.com <- data.frame(pdfs, x)
sum_stat <- matrix(NA, ncol = 7, nrow = 3)
for (i in 1:3){
  sum_stat[i,1] <- min(x.com[,4][x.com[,i]==quantile(x.com[,i], probs=.025)])
  sum_stat[i,2] <- quantile(x.com[,i], probs=.025)
  sum_stat[i,3] <- x.com[,4][x.com[,i]==max(x.com[,i])]
  sum_stat[i,4] <- max(x.com[,i])
  sum_stat[i,5] <- max(x.com[,4][x.com[,i]==quantile(x.com[,i], probs=.975)])
  sum_stat[i,6] <- quantile(x.com[,i], probs=.975)
}
sum_stat <- data.frame(sum_stat)
sum_stat[,7] <- colnames(x.com)[1:3]
sum_stat[,7] <- as.factor(sum_stat[,7])
colnames(sum_stat) <- c("left", "left_val", "max", "max_val", "right", "right_val", "variable")
sum_stat

# convert dataframe to tall format
# library(tidyr)
pdfs$x <- x
tall_df <- gather(pdfs, Type, density, -x)
tall_df$Type

tt <- transform(tall_df,
                Type=factor(Type,levels=c("A", 
                                          "B",
                                          "C")))

ggplot(tt, aes(x = x, y = density, fill = Type, color = Type)) + 
  geom_line() +

  geom_point(inherit.aes = FALSE, 
             data = sum_stat, 
             aes(x = max, y = 0, alpha=0.4),
             show.legend = FALSE) +

  geom_errorbarh(inherit.aes = FALSE, 
                 data = sum_stat, 
                 aes(xmin = left, xmax = right, y = 0, alpha=0.4), 
                 height = 0.1, show.legend = FALSE) +

  facet_wrap(~ Type, ncol = 1) +
  theme(strip.background = element_blank(),
        strip.text.x = element_blank())

1 Ответ

3 голосов
/ 11 марта 2020

Вы можете переименовать имена ваших sum_stat, чтобы они соответствовали именам переменных tt:

colnames(sum_stat)[7] <- "Type"

Затем удалите inherit.aes = FALSE и просто передайте aes аргумент в адекватном geom. Например, когда вы позвоните facet_grid, он отделит sum_stat в соответствии с Type переменной:

  ggplot(tt) + 
    geom_line(aes(x = x, y = density, fill = Type, color = Type)) +
    geom_point(data = sum_stat, 
               aes(x = max, y = 0, alpha=0.4),
               show.legend = FALSE, color = "black") +

    geom_errorbarh(data = sum_stat, 
                   aes(xmin = left, xmax = right, y = 0, alpha=0.4), 
                   height = 0.1, show.legend = FALSE, color = "black") +

    facet_wrap(~ Type, ncol = 1) +
    theme(strip.background = element_blank(),
          strip.text.x = element_blank())

enter image description here

Это то, что вы ищете?

...