考虑这个初始数据框(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")
答案 0 :(得分:2)
这是一种数据形状&#39;问题。如果希望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)
通过在连续步骤(如View
)之后调用RStudio的%>% 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