2017-08-10 467 views
2

考虑该初始数据帧(yld_sum):geom_abline多个斜率和截距

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

你能具体谈谈你的不满?你对数据转换代码不满意吗?绘图代码?一般性和可扩展性? – Gregor

+0

我想用初始表来做那个阴谋......我想避免中间数据帧... – Juanchi

+1

那么,你不能很好地直接从那张表中绘制出来。我建议的简化方法是将你的数据框合并成一个单独的列,表示估计值,ub或lb,然后你可以用'linetype = ifelse(type ==“estimate”)做一个'geom_abline', =互动(类型,Yld_class)'美学。我没有看到你的转换代码如何能够以该表格为开始变得简单,但是从模型开始可能会更容易... – Gregor

回答

1

这是一个 '数据形状' 的问题。如果您希望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 
相关问题