Средняя линия чертежа пакета (НЕ МЕДИАНА)

Я хотел бы провести черту через мои графики для среднего. Встроенные аргументы квантилей рисуют линию в нужном мне стиле, но с медианным значением. Как я могу нарисовать один в среднем, желательно без использования geom_vline () или ощупайте ggplot build object, но оставаясь в экологии ggridges?

library(tidyverse)
library(ggridges)

#adding a column for the mean of each Species of the iris dataframe
iris_meaned <- iris %>%
  group_by(Species) %>% 
  mutate(mean_petal_len = mean(Petal.Length)) %>% 
  ungroup()


iris_meaned %>% 
  ggplot() +
  geom_density_ridges(
    aes(x = Petal.Length, y = Species, fill = Species), 
    quantile_lines = T, quantiles = 2 #adding lines for the median
  ) +
  geom_text(
    aes(x = mean_petal_len, y = Species, label = round(mean_petal_len, 2)),
    size = 2, nudge_x = 0.03, nudge_y = 0.35
  ) +
  theme_classic() +
  theme(
    axis.title = element_blank(), 
    legend.position = "None"
  ) 

Пример со срединными линиями


person Laserhedvig    schedule 23.05.2020    source источник


Ответы (1)


Вы можете указать произвольную функцию аргументу quantile_fun. Функция должна принимать числовой вектор в качестве первого аргумента, а количество квантилей - в качестве второго. Но второй аргумент можно проигнорировать. Функция mean() удовлетворяет этим критериям, поэтому quantile_fun = mean создает вертикальные линии в среднем.

Обратите внимание, что в вашем примере вы наносите текстовые метки снова и снова. Я исправил код, чтобы он работал правильно.

library(tidyverse)
library(ggridges)

iris_meaned <- iris %>%
  group_by(Species) %>% 
  summarize(mean_petal_len = mean(Petal.Length))

ggplot(iris) +
  geom_density_ridges(
    aes(x = Petal.Length, y = Species, fill = Species), 
    quantile_lines = T, quantile_fun = mean)  + 
  geom_text(
    data = iris_meaned,
    aes(x = mean_petal_len, y = Species, label = round(mean_petal_len, 2)),
    size = 2, nudge_x = 0.03, nudge_y = 0.35
  ) +
  theme_classic() +
  theme(
     axis.title = element_blank(), 
     legend.position = "None"
  ) 
#> Picking joint bandwidth of 0.155

Создано 23 мая 2020 г. пакетом REPEX (v0.3.0)

Чтобы предоставить второй пример, давайте нарисуем линии как в среднем, так и в среднем +/- 1 стандартное отклонение. Мы можем сделать это, определив функцию meansd(), которая возвращает вектор этих трех значений.

library(tidyverse)
library(ggridges)

meansd <- function(x, ...) {
  mean <- mean(x)
  sd <- sd(x)
  c(mean - sd, mean, mean + sd)
}

ggplot(iris) +
  geom_density_ridges(
    aes(x = Petal.Length, y = Species, fill = Species), 
    quantile_lines = T, quantile_fun = meansd)  + 
  theme_classic() +
  theme(
    axis.title = element_blank(), 
    legend.position = "None"
  ) 
#> Picking joint bandwidth of 0.155

Создано 23 мая 2020 г. пакетом REPEX (v0.3.0)

person Claus Wilke    schedule 23.05.2020
comment
Можно ли сделать это каким-либо образом для взвешенных средних с помощью wtd.mean или аналогичной функции? Я продолжаю получать ошибки, когда пытаюсь. - person Tobias P. G.; 11.05.2021
comment
Для краткости я предпочитаю избегать вычисления iris_meaned и вместо этого использую stat_summary(). Для этого сначала сопоставьте эстетику с ggplot(iris, aes(x = Petal.Length, y = Species, fill = Species)), затем добавьте geom_density_ridges(quantile_lines = T, quantile_fun = mean) и, наконец, stat_summary(aes(label = round(..x.., 2)), fun = "mean", geom = "text", size = 2. @clauswilke, есть ли причина отдавать предпочтение iris_meaned? - person Emman; 07.07.2021