Прямоугольная диаграмма GGPLOT, разделенная по цвету со средствами в середине прямоугольника

#r #ggplot2 #mean #boxplot

Вопрос:

У меня есть данные с двумя категориальными переменными. Я могу поместить их в коробку, но я не могу получить средства для отображения в правильном положении. Я создал эффект в наборе данных iris (красные прямоугольники добавляются вручную, а не в ggplot).

средства не отображаются с помощью соответствующего бокс-графика

 Iris <- iris %>%
        mutate(SepalLengthType = ifelse(Sepal.Length > 5.8, "high", "low"))

means <- Iris %>% 
        group_by(Species, SepalLengthType) %>% 
        summarise(Sepal.Width = mean(Sepal.Width), .groups = "keep")
plot <- ggplot(data = Iris, aes(y=Sepal.Width, x = SepalLengthType, colour = Species)) 
        geom_boxplot()
 

Теперь я хочу добавить средства к каждому прямоугольному участку
Эти строки ниже всех работают, но среднее значение сосредоточено не на прямоугольном графике, а на категории SepelLengthType.

 plot   stat_summary(fun = "mean" , aes(color = Species), shape = 15)
plot   stat_summary(fun = "mean" , aes(group = Species), shape = 15)
plot   stat_summary(fun.y = "mean", shape = 15) # this works, but is deprecated
plot   geom_point(data = means, aes(color = Species), shape = 15)
 

Как можно отобразить средства в середине каждого прямоугольника?
Я ценю, что мог бы переставить данные так, чтобы каждый набор точек данных находился в своем собственном столбце, но поскольку они не все одинаковой длины, для этого нужны собственные обходные пути.

Когда я использую fun = «имею в виду», я получаю предупреждающее сообщение «Удалены 5 строк, содержащих пропущенные значения (geom_segment)». Это почему? В строке «средства» этой проблемы нет, но я бы предпочел не вычислять средства самостоятельно.

Ответ №1:

Вы можете использовать position=position_dodge(0.9) , например, следующий код

 library(tidyverse)

Iris <- iris %>%
  mutate(SepalLengthType = ifelse(Sepal.Length > 5.8, "high", "low"))

means <- Iris %>% 
  group_by(Species, SepalLengthType) %>% 
  summarise(Sepal.Width = mean(Sepal.Width), .groups = "keep")

plot <- ggplot(data = Iris, aes(y=Sepal.Width, x = SepalLengthType, colour = Species)) 
  geom_boxplot(position=position_dodge(0.9))

plot   geom_point(data = means, aes(color = Species), shape = 15, 
                  position = position_dodge2(width = 0.9))
 

введите описание изображения здесь

или использовать stat_summary в качестве

 plot   stat_summary(fun = "mean", aes(group = Species), shape = 15, 
                  position = position_dodge2(width = 0.9))
 

введите описание изображения здесь

Комментарии:

1. Большое спасибо, позиционный додж сделал свое дело. Но знаете ли вы, почему я получаю предупреждение? «Удалены 4 строки, содержащие недостающие значения (geom_segment)».

2. Я думаю, это потому, что setosa не имеет никакой ценности в рамках высокой категории.

3. Нет, я получаю то же самое предупреждение с моими собственными данными. Для моих данных удалены 4 строки, а здесь удалены 5 строк. Это относится к количеству боксовых участков. Если я отброшу цвет= Вид и у меня будет только два боковых графика, то в предупреждающих сообщениях будет написано: «Удалены 2 строки, содержащие недостающие значения (geom_segment)».