2017-06-29 2 views
1

Ich versuche, mehrere ROC-Kurven auf einem einzigen Diagramm mit ggplot2 plotten. Hier ist, wie weit ich habe:Plot mehrere ROC-Kurven mit ggplot2 in verschiedenen Schichten

ggroc2 <- function(columns, data = mtcars, classification = "am", 
        interval = 0.2, breaks = seq(0, 1, interval)){ 
    require(pROC) 
    require(ggplot2) 

    #The frame for the plot 
    g <- ggplot() + geom_segment(aes(x = 0, y = 1, xend = 1,yend = 0)) + 
    scale_x_reverse(name = "Specificity",limits = c(1,0), breaks = breaks, 
expand = c(0.001,0.001)) + 
    scale_y_continuous(name = "Sensitivity", limits = c(0,1), breaks = 
breaks, expand = c(0.001, 0.001)) + 
    theme_classic() + coord_equal() 

    #The loop to calculate ROC's and add them as new layers 
    for(i in 1:length(columns)){ 
    croc <- roc(data[,classification], data[,columns[i]]) 
    plotx <- rev(croc$specificities) 
    ploty <- rev(croc$sensitivities) 
    g <- g + geom_step(aes(x=plotx, y=ploty)) 
    } 

    g 
} 



#Sample graph 
ggroc2(c("mpg", "disp", "drat", "wt")) 

Das Problem ist, dass nur der letzte Parameter in der columns Liste aufgetragen wird. Ich habe festgestellt, dass das Problem mit aes() und faule Bewertung nach dem Lesen the answer to this question in Verbindung stehen muss. Dieses Beispiel verwendet geom_segment(), und das Problem wird nach dem Entfernen von aes() insgesamt gelöst. Es funktioniert nicht für mich, weil ich irgendwie die Daten abbilden muss. Wenn ich hier aes() entferne, wird nichts geplottet. Wie arbeite ich das Problem der faulen Bewertung in geom_, die von aes() abhängen?

+1

[Diese Antwort] (https://stackoverflow.com/a/15988472/2461552) zeigt die Variablennamen und 'aes_string' als Behelfslösung. – aosmith

+0

In Bezug auf das doppelte Problem, danke für das Aufzeigen. Ich versuche zu entscheiden, ob ich auf das "Das löste mein Problem!" Klicken sollte. Taste oder "Ich werde bearbeiten, um zu erklären, wie". Meine Frage scheint wirklich ein Duplikat zu sein, aber ich finde die Antwort unten eine viel elegantere und effizientere Lösung, als meine Daten in ein langes Format umzuwandeln. Was soll ich machen? – naco

+1

Einer der Gründe, warum ich das als Duplikat gegen andere Duplikate gewählt habe, ist, dass es den 'data.frame' Workaround zeigt. Die gegebene Antwort verwendet denselben Ansatz. – aosmith

Antwort

1

Hier ist eine funktionierende Version Ihres Codes.
Das endgültige grafische Ergebnis ist nicht so gut und sollte verbessert werden.

ggroc2 <- function(columns, data = mtcars, classification = "am", 
        interval = 0.2, breaks = seq(0, 1, interval)){ 
    require(pROC) 
    require(ggplot2) 

    #The frame for the plot 
    g <- ggplot() + geom_segment(aes(x = 0, y = 1, xend = 1,yend = 0)) + 
    scale_x_reverse(name = "Specificity",limits = c(1,0), breaks = breaks, 
expand = c(0.001,0.001)) + 
    scale_y_continuous(name = "Sensitivity", limits = c(0,1), breaks = 
breaks, expand = c(0.001, 0.001)) + 
    theme_classic() + coord_equal() 

    #The loop to calculate ROC's and add them as new layers 
    cols <- palette() 
    for(i in 1:length(columns)){ 
    croc <- roc(data[,classification], data[,columns[i]]) 
    sens_spec <- data.frame(spec=rev(croc$specificities), 
          sens=rev(croc$sensitivities)) 
    g <- g + geom_step(aes(x=spec, y=sens), data=sens_spec, col=cols[i], lwd=1) 
    } 
    g 
} 

#Sample graph 
ggroc2(c("mpg", "disp", "drat", "wt")) 

enter image description here

+0

"Das endgültige grafische Ergebnis ist nicht so gut und sollte verbessert werden." Beziehen Sie sich auf die überlappenden Linien? Wie auch immer, sehr demonstrative Antwort, danke. Ich verstehe es sehr deutlich. Es sollte leicht sein, von hier aus weiter zu gehen. – naco

+1

@naco Ja, ich mag keine überlappenden Zeilen. Wie auch immer, ich bin froh, dass du meine Antwort hilfreich gefunden hast! –

Verwandte Themen