2016-08-04 5 views
2

Ich habe das folgende Beispiel zur Veranschaulichung meiner Frage geschrieben.Wie kann ich effizient eine manuelle Legende erstellen, wenn eine Schleife zum Erstellen mehrerer geom_hline-Objekte in einer Facette verwendet wird?

Ich wollte meine eigene benutzerdefinierte Legende und Farbschema für jede geom_hline ich plotten erstellen. Ich könnte dies erreichen mit dieser Antwort Construct a manual legend for a complicated plot.

Ich erstelle jedoch eine Funktion, die eine beliebige Anzahl horizontaler Linien auf dem Diagramm mit einer Schleife erstellen wird. Dies bedeutet, dass ich die aes_string-Funktion dynamisch mit Variablen versorgen musste. aes_string(yintercept = colname, colour = colname) funktioniert jedoch nicht. als würde ich den folgenden Fehler erhalten: 'geom_hline Error: Discrete value supplied to continuous scale'.

Dies führte mich zu dem Erstellen der folgenden Lösung, die das Erstellen einer zusätzlichen Spalte für jede Zeile enthält, die ich plotten möchte, die einen Namen enthält, der von dem Vektor in scale_colour_manual aufgenommen werden kann. Ich finde das umständlich und ineffizient.

Dies funktioniert wie beabsichtigt, aber ich habe 2 Fragen:

  1. Warum aes_string(yintercept = colname, colour = colname_colour) Arbeit und aes_string(yintercept = colname, colour = colname) nicht der Fall ist.

  2. Es muss einen effizienteren Weg geben, um den Ausgang zu erreichen, den ich habe, was fehlt mir?

Ausgabe von Beispielcode: http://imgur.com/a/dvzAM

mean_wt <- data.frame(cyl = c(4, 6, 8) 
, wt = c(2.28, 3.11, 4.00) 
, wt2 = c(3.28, 4.11, 5.00) 
, wt_col = c("a", "a", "a") 
, wt_col2 = c("b", "b", "b")) 

hline_listA <- list() 
for(i in 2:3){ 
    colname <- mean_wt[,i] 
    colname_colour <- mean_wt[,i+2] 
    grob <- geom_hline(data =mean_wt 
, aes_string(yintercept = colname, colour = colname_colour)) 
    hline_listA[[i-1]] <- grob 
} 
ggplot() + 
    geom_point(data = mtcars, aes(mpg, wt)) + 
    hline_listA + 
    facet_wrap(~ cyl, scales = "free", nrow = 1) + 
    scale_colour_manual(name = "legend", values = c( 
    "a" = "seagreen1" 
    , "b" = "darkorange")) 

Antwort

0

Ich kann keine Situation vorstellen, war ich eine Schleife verwenden, würde alles in ggplot zu tun. Der übliche Weg, um das zu erreichen, was Sie wollen, ist, den Datenrahmen so anzupassen, dass ggplot damit arbeiten kann. Hier ist eine viel kürzere Lösung mit dem Aufruf geom_line nur einmal.

library(ggplot2) 
mean_wt <- data.frame(cyl = c(4, 6, 8), 
         wt = c(2.28, 3.11, 4.00, 3.28, 4.11, 5.00), 
         wt_col = c("a", "a", "a", "b", "b", "b")) 

ggplot() + 
    geom_point(data = mtcars, aes(mpg, wt)) + 
    geom_hline(data = mean_wt,aes(yintercept = wt, color = wt_col)) + 
    facet_wrap(~ cyl, scales = "free", nrow = 1) + 
    scale_colour_manual(name = "legend", 
         values = c("a" = "seagreen1", 
           "b" = "darkorange")) 

enter image description here

+0

Hallo danke dafür! Ich bin ziemlich neu in R und fühlte, dass ich ein grundlegendes Konzept vermisste, als ich versuchte, dies zu schaffen, und ein "langer" Datenrahmen ist, was mir fehlte. Ich gehe davon aus, dass dies auch funktioniert, wenn Sie versuchen, Alpha-Werte manuell verschiedenen Füllungen zuzuweisen, zB mit scale_fill_alpha und der vierten Spalte im ursprünglichen Datenrahmen. Es ist so, dass Penny gefallen ist haha, müssen Sie eine Reihe von sinnlosen Schleifen neu schreiben. Vielen Dank! – DataJack