考虑这个初始数据框(yld_sum):
coef pred se ci.lb ci.ub cr.lb cr.ub Yld_class
b0 3164.226 114.256 2940.289 3388.164 2142.724 4185.728 1Low
b1 -20.698 3.511 -27.580 -13.816 -50.520 9.124 1Low
b0 3985.287 133.220 3724.180 4246.394 2954.998 5015.576 2Low
b1 -14.371 4.185 -22.573 -6.168 -44.525 15.784 2Low
如何简化语法来绘制两条估计回归线及其各自的 CI,并获得以下图?
这是我的详细代码:
library(tidyverse)
yld_sum_est <- yld_sum %>% select(Yld_class, coef, pred) %>%
spread(coef, pred)
yld_sum_low <- yld_sum %>% select(Yld_class, coef, ci.lb) %>%
spread(coef, ci.lb)
yld_sum_up <- yld_sum %>% select(Yld_class, coef, ci.ub) %>%
spread(coef, ci.ub)
ggplot() +
geom_abline(data = yld_sum_est, aes(intercept = b0, slope = b1)) +
geom_abline(data = yld_sum_low, aes(intercept = b0, slope = b1), linetype= "dashed") +
geom_abline(data = yld_sum_up, aes(intercept = b0, slope = b1), linetype= "dashed") +
scale_x_continuous(limits=c(0,60), name="x") +
scale_y_continuous(limits=c(1000, 4200), name="y")
最佳答案
这是一个“数据形状”问题。如果你想要ggplot
要在一次调用中绘制多个对象,对象参数(如 intercept
和 slope
)需要是数据框的列,对象实例需要是数据输入 ggplot
时的行。 。
特别是在您的情况下,您需要一个包含 6 行的数据框 - 每行一个,每行保存该行的标识及其参数,如下所示:
library(tidyverse)
# data block from the question is in clipboard
read.table("clipboard", header = T) -> yld_sum
yld_sum %>%
select(-starts_with("cr"), -se) %>%
gather(metric, value, -coef, -Yld_class) %>%
spread(coef, value) %>%
ggplot() +
geom_abline(aes(
intercept = b0,
slope = b1,
linetype = if_else(metric == "pred", "", "dashed")),
) +
scale_x_continuous(limits=c(0,60), name="x") +
scale_y_continuous(limits=c(1000, 4200), name="y") +
guides(linetype = F)
随意将 RStudio 的 View
探索数据 reshape 过程。在连续步骤后调用(如 %>% View
)。
数据的最终形状,用于说明(在 spread()
调用之后):
Yld_class metric b0 b1
1 1Low ci.lb 2940.289 -27.580
2 1Low ci.ub 3388.164 -13.816
3 1Low pred 3164.226 -20.698
4 2Low ci.lb 3724.180 -22.573
5 2Low ci.ub 4246.394 -6.168
6 2Low pred 3985.287 -14.371
关于r - geom_abline 多个斜率和截距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45624655/