2017-08-10 1 views
2

In Anbetracht dieser ursprünglichen Datenrahmen (yld_sum):geom_abline mehrere Steigungen und Schnitt

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 

Wie kann ich meine vereinfachen Syntax die beiden geschätzten Regressionsgeraden mit ihren jeweiligen CI und erhalten die folgende Handlung zu planen?

enter image description here

Dies ist mein ausführlicher Code:

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

Können Sie etwas über Ihre Unzufriedenheit konkretisieren? Bist du mit dem Datentransformationscode nicht zufrieden? Der Plotcode? Die Allgemeinheit und Skalierbarkeit? – Gregor

+0

Ich möchte die Anfangstabelle verwenden, um dieses Diagramm zu machen ... Ich möchte die Zwischendatenframes vermeiden ... – Juanchi

+1

Nun, Sie können nicht sehr gut direkt von dieser Tabelle plotten. Die Vereinfachung, die ich vorschlagen würde, würde Ihre Datenrahmen zu einem mit einer einzelnen Spalte kombinieren, die Schätzung, ub oder lb anzeigt, und dann könnten Sie eine einzelne 'geom_abline' mit' linetype = ifelse (type == "schätzen") Gruppe tun = Interaktion (Typ, Yld_class) 'Ästhetik. Ich sehe nicht, wie Ihr Transformationscode mit dieser Tabelle viel einfacher als der Start werden kann, aber vielleicht von den Modellen ausgehend wäre einfacher ... – Gregor

Antwort

1

Es ist ein 'Datenform' Problem. Wenn Sie möchten, dass ggplot mehrere Objekte innerhalb eines einzelnen Aufrufs zeichnet, müssen die Objektparameter (wie intercept und) die Spalten Ihres Datenrahmens und die Objektinstanzen die Zeilen sein, wenn die Daten ggplot eingeben.

Besonders in Ihrem Fall benötigen Sie einen Datenrahmen mit 6 Reihen - eine für jede Zeile, die jeweils die Identität der Linie halten und es ist Parameter, wie folgt aus:

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) 

Fühlen Sie sich frei, um die Daten Umbildung zu erkunden Prozess, indem RStudio View Anruf nach aufeinanderfolgenden Schritten (wie %>% View) setzen.

Die endgültige Form der Daten, für die Abbildung (nach dem spread() Aufruf):

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