2013-05-01 4 views
12

Nehmen wir an, ich brauche keine "richtige" Variablenzuordnung, möchte aber noch Legendenschlüssel, um das Diagrammverständnis zu unterstützen. Meine aktuellen Daten sind ähnlich wie die folgende dfVerschiedene Legendenschlüssel in derselben Legende in ggplot2

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

library(ggplot2) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points")) 

enter image description here

Grundsätzlich mag ich die Legende Schlüssel in Bezug auf points zu sein .. nur einen Punkt, ohne die Linie in der Mitte. Ich bin damit nahe dran:

library(reshape2) 

df <- melt(df, id.vars="id") 

ggplot() + 
    geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) + 
    geom_line(aes(id, value, colour = variable), df[df$variable=="line",]) 

aber es definiert zwei separate Legenden. Das Korrigieren des zweiten Codes (und das Umformen meiner Daten) wäre ebenfalls in Ordnung, aber ich würde einen Weg (falls vorhanden) bevorzugen, jeden Legendenschlüssel manuell zu ändern (und den ersten Schritt weiter zu verwenden). Vielen Dank!

EDIT:

Dank @alexwhan Sie mein Gedächtnis über Variable Mapping aktualisiert. Allerdings habe ich der einfachste Weg, so weit habe, ist immer noch der folgende (sehr schlecht Hack!):

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, shape = "points")) + 
    theme(legend.title=element_blank()) 

die gerade den Titel der beiden verschiedenen Legenden versteckt.

enter image description here

Andere Ideen mehr als willkommen !!!

Antwort

25

Sie können override.aes= innerhalb guides() Funktion verwenden, um das Standard-Erscheinungsbild der Legende zu ändern. In diesem Fall lautet Ihre Anleitung color= und dann sollten Sie shape=c(NA,16) festlegen, um die Form für die Linie zu entfernen und dann linetype=c(1,0), um die Linie vom Punkt zu entfernen.

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points"))+ 
    guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0)))) 

enter image description here

+0

Sehr schöne Methode. Wahrscheinlich das beste verfügbare. Ich wollte nur auf jemand anderen warten, aber es scheint, das ist auch das einzige :-). Wie auch immer, vielen Dank! – Michele

6

Ich bin mir nicht bewusst irgendeine Weise dies leicht zu tun, aber man kann so eine Hack Version tun (Sie geschmolzen Datenrahmen verwendet wird):

p <- ggplot(df.m, aes(id, value)) + 
    geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) + 
    geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1)) 

enter image description here

Der Schlüssel ist, dass Sie brauchen um das Mapping richtig zu machen, damit es in der Legende korrekt angezeigt wird. In diesem Fall heißt es "richtig" zu machen, dass man es so täuscht, dass es so aussieht, wie man es will. Es lohnt sich, darauf hinzuweisen, dass dies nur funktioniert, weil Sie linetype auf leer (0) setzen und dann die alpha Skala für die Punkte verwenden können. Sie können alpha nicht für beide verwenden, da es nur eine Skalierung benötigt.