Выпуклая оболочка на горизонтальных и вертикальных столбцах ошибок

#r #ggplot2 #convex-hull

#r #ggplot2 #выпуклая оболочка

Вопрос:

У меня есть ggplot со средними значениями и как горизонтальными, так и вертикальными полосами ошибок, и я хотел бы добавить выпуклую оболочку, которая охватывает все полосы ошибок — вот так:

плохо нарисованный пример выпуклой оболочки

Я пробовал с stat_chull помощью from ggpubr , но не уверен, как указать эстетику, когда есть xmin , xmax , ymin и ymax для полос ошибок каждой точки. Ниже показано, как я закодировал график, указав в stat_chull aes качестве примера значения X и Y — я знаю, что это неверно, но я думаю, что я на правильном пути?

 ggplot() 
  geom_point(data = df, aes(MeanX,MeanY))  
  geom_errorbar(data = df, 
                mapping = aes(x = MeanX,
                              ymin = MeanY - SdY, 
                              ymax = MeanY   SdY), 
                width = 0, inherit.aes = FALSE) 
  geom_errorbarh(data = df, 
                 mapping = aes(y = MeanY,
                               xmin = MeanX - SdX,
                               xmax = MeanX   SdX),
                 height = 0, inherit.aes = FALSE) 
  stat_chull(data = df, aes(MeanX,MeanY)) 
  theme_classic()
  

Это дает следующий график:

Выпуклая оболочка только для средних значений

Я также пробовал geom_polygon и получил мусор.

Вот данные:

 df<-structure(list(Source = structure(1:5, .Label = c("A", "B", "C", "D", 
                                                      "E"), class = "factor"), MeanX = c(-18.7066666666667, 
                                                                                                                                -15.8769230769231, -16.8620689655172, -15.72, -17.4333333333333
                                                      ), SdX = c(1.61072554509115, 0.409201849758959, 1.04811067886951, 
                                                                       0.74057035077327, 1.15902257671425), MeanY = c(9.93666666666667, 
                                                                                                                            14.3230769230769, 9.22758620689655, 11.1, 13.7333333333333), 
                   SdY = c(1.03005970142791, 0.539116085686704, 0.504990221704281, 
                                 0.757187779440037, 1.05039675043925)), row.names = c(NA, 
                                                                                      -5L), class = "data.frame")
  

Любая помощь приветствуется!

Ответ №1:

Работает ли для вас следующее?

 library(dplyr)

df %>%
  mutate(ymin = MeanY - SdY,
         ymax = MeanY   SdY,
         xmin = MeanX - SdX,
         xmax = MeanX   SdX) %>%
  ggplot(aes(x = MeanX, y = MeanY)) 
  geom_point()  
  geom_errorbar(aes(ymin = ymin, ymax = ymax),
                width = 0) 
  geom_errorbarh(aes(xmin = xmin, xmax = xmax),
                 height = 0) 
  stat_chull(data = . %>%
               summarise(x = c(MeanX, MeanX, MeanX, xmin, xmax),
                         y = c(MeanY, ymin, ymax, MeanY, MeanY)),
             aes(x = x, y = y),
             geom = "polygon", colour = "black", fill = NA) 
  theme_classic()
  

график

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

1. Спасибо @Z.Lin. Не то решение, которое я ожидал, но оно сработало хорошо!