ggplot geom_boxplot middle aes без эффекта - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь построить boxplot с помощью ggplot2. Я хочу изменить середину, чтобы означать.

Я знаю, что люди задавали подобные вопросы раньше, но я спрашиваю об этом, потому что решение не сработало для меня. В частности, я следовал за первым решением в этом принятом ответе

Это то, что я сделал с данными теста mpg:

library(ggplot2)
library(tidyverse)

mpg %>%
  ggplot(aes(x = class, y = cty, middle = mean(cty))) +
  geom_boxplot()

Не имеет никакого эффекта.

график, означающий: enter image description here

график с медианой по умолчанию: enter image description here

Может кто-нибудь помочь указать, что я сделал не так? Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

В конце концов, мне пришлось создать итоговую df для этого. Это не то, что я искал изначально, но это работает.

df <- mpg %>%
  group_by(class) %>%
  summarize(ymin = min(cty), ymax = max(cty), lower = quantile(cty, 0.25), upper = quantile(cty, 0.75), middle = mean(cty)) 

df %>%
  ggplot(aes(class)) +
  geom_boxplot(aes(ymin = ymin, ymax = ymax, lower = lower, upper = upper, middle = middle), stat = 'identity')
0 голосов
/ 31 октября 2018

Возиться с другим набором данных, mtcars, показывает то же самое, определяя, что middle не меняет его. И у этого есть некоторые большие различия в среднем значении. Другой вариант - использование stat_summary, хотя я не могу заставить функцию точек работать правильно, и мне пришлось настроить ее, чтобы не получить ошибку arguments imply differing number of rows: 1, 0.

BoxMeanQuant <- function(x) {
    v <- c(min(x), quantile(x, 0.25), mean(x), quantile(x, 0.75), max(x))
    names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
    v
  }

mpg %>%
  ggplot(aes(x = class, y = cty)) +
  stat_summary(fun.data = BoxMeanQuant, geom = "boxplot")

По сравнению с обычным geom_boxplot, в котором не используется определенный middle.

mpg %>% 
  ggplot(aes(x = class, y = cty)) +
  geom_boxplot(aes(middle = mean(cty)))

Это то, что я использовал для отображения выбросов в виде точек, но они отличаются от значений по умолчанию для geom_boxplot. Вы можете настроить по мере необходимости. Без использования if-else будет выдано сообщение об ошибке.

BoxMeanQuant <- function(x) {
  v <- c(quantile(x, 0.1), quantile(x, 0.25), mean(x), quantile(x, 0.75), quantile(x, 0.9))
  names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
  v
}

outliers <- function(x) {
  if (length(x) > 5) {
  subset(x, x < quantile(x, 0.1) | quantile(x, 0.9) < x)
  } else {
    return(NA)
  }
}

ggplot(data = mpg, aes(x = class, y = cty)) +
stat_summary(fun.data = BoxMeanQuant, geom = "boxplot") +
stat_summary(fun.y = outliers, geom = "point")

...