#r #ggplot2 #graph
Вопрос:
У меня проблема с барами ошибок в ggplot2.
Я хочу построить график взаимодействия между непрерывной [iv] и номинальной [условной] переменной. Я использую такой код
iv = runif(n = 100, min = 1, max = 7)
condition <- rep(letters[1:2], length.out = 100)
y = runif(n = 100, min = 1, max = 100)
df <- data.frame(iv, condition, y)
lm20 <- lm(y ~ condition * iv, data = df)
summary(lm20)
df$condition <- as.factor(df$condition)
ggeffect(lm20, terms = c("condition", "iv")) %>%
plot(show.title = FALSE)
stat_summary(fun.y = mean,
geom = "point")
stat_summary(fun.y = mean,
geom = "line")
stat_summary(fun.data = mean_cl_boot,
geom = "errorbar")
scale_y_continuous("Voting intentions", limits = c(0, 100))
scale_colour_discrete(name = "Control", labels = c("Low", "Medium", "High"))
scale_x_discrete("Condition", labels = c("Low","High")
И вот что я получаю:
Я сталкиваюсь с двумя проблемами
- Полосы ошибок и линии не совпадают
- Я не могу изменить метки на оси X
Ответ №1:
Здесь происходит пара вещей. В основном:
- вам нужно установить
position_dodge
значение, которое смещает ваши добавленные очки на ту же величину,ggeffects
на которую уже смещены полосы ошибок ggeffects
на самом деле используется непрерывная шкала по оси x. Смотрите мое использованиеscale_x_continuous()
ниже …mean_cl_boot
похоже, он ничего не делает, не совсем понял, почему
library(ggeffects)
library(ggplot2)
library(magrittr)
pd <- position_dodge(width=0.25) ## width set by trial amp; error to match ggeffects plot
ggeffect(lm20, terms = c("condition", "iv")) %>%
plot(show.title = FALSE)
## set large size/alpha to distinguish mean points from the
## (identical) points that ggeffects is already using for the estimated values
stat_summary(fun = mean, geom = "point", position = pd, size = 5,
alpha=0.5)
stat_summary(fun = mean, geom = "line", position = pd)
stat_summary(fun.data = mean_cl_boot, geom = "errorbar",
position = pd, size = 5, alpha=0.5)
scale_y_continuous("Voting intentions", limits = c(0, 100))
scale_colour_discrete(name = "Control", labels = c("Low", "Medium", "High"))
scale_x_continuous(name = "Condition",
breaks = 1:2,
labels = c("Low","High"))
Комментарии:
1. Фантастика, большое вам спасибо! Так полезно!
Ответ №2:
Ниже приведено решение, использующее исключительно ggplot2, поэтому оно не такое элегантное… Посмотрите, сработает ли это!
# Create data frame with the effects
df <- as.data.frame(ggeffect(lm20, terms = c("condition", "iv")))
# Add coordinates manually
df$x2 <- rep(1:2, 3) rep(c(-.1,0,.1), each = 2)
# Plot
ggplot(df, aes(x2, predicted, col = group))
geom_errorbar(aes(x = x2, ymin = predicted-std.error, ymax = predicted std.error), width = .1)
geom_segment(df %>% pivot_wider(id_cols = group, names_from = x, values_from = c(predicted:conf.high, x2)),
mapping = aes(x = x2_a, xend = x2_b, y = predicted_a, yend = predicted_b))
geom_point(size = 2)
scale_color_discrete("Control",c("#9b2756", "#003054","#66b0a5"), labels=c("Low", "Medium", "High"))
scale_y_continuous("Voting intentions", limits = c(0, 100))
scale_x_continuous("Condition", breaks = 1:2, labels = c("Low","High"))
Комментарии:
1. Отлично, большое вам спасибо — приятно знать, что это возможно только с помощью ggplot2!