#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. Не то решение, которое я ожидал, но оно сработало хорошо!