2017-08-10 235 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 
相關問題