ggplot2 中的错误栏和线条不匹配
Error bars and lines do not match in ggplot2
我在 ggplot2 中遇到错误栏问题。
我想绘制连续 [iv] 和标称 [condition] 变量之间的相互作用。
我用的是这样的代码
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 轴上的标签
下面是一个仅使用 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"))
结果如下:
这里发生了几件事。主要是:
- 您需要设置一个
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 & 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"))
我在 ggplot2 中遇到错误栏问题。
我想绘制连续 [iv] 和标称 [condition] 变量之间的相互作用。 我用的是这样的代码
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 轴上的标签
下面是一个仅使用 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"))
结果如下:
这里发生了几件事。主要是:
- 您需要设置一个
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 & 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"))