geom_abline多个斜坡和截距

时间:2017-08-10 23:00:25

标签: r ggplot2 tidyverse

考虑这个初始数据框(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,并获得以下图?

enter image description here

这是我的详细代码:

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") 

1 个答案:

答案 0 :(得分:2)

这是一种数据形状&#39;问题。如果希望ggplot在单个调用中绘制多个对象,则对象参数(如interceptslope)必须是数据框的列,而对象实例必须是数据进入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