2016-12-09 2 views
2

Ich zeichne zwei Variablen in der gleichen Grafik, und jede Variable ist nach Jahr gruppiert. Meine Legende zeigt die Farbdifferenzierung nach Jahr, aber ich kann nicht herausfinden, wie man der Legende einen Linientyp hinzufügt. Im Idealfall würde es 4 Zeilen in der Legende sein: rosa = 2015, blau = 2016 und gepunktete Linie = Var1, durchgezogene Linie = Var2Wie können Legendeneigenschaften angepasst werden, um 2 Merkmale anzuzeigen?

Hier ist meine Probe df:

year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016) 
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12) 
Var1 <- sample(30:60, 24, rep=TRUE) 
Var2 <- sample(70:90, 24, rep=TRUE) 
df <- data.frame(year,month,Var1, Var2) 

und Grundstück:

plot <- ggplot(df)+ 
    geom_line(aes(x=as.factor(month), y=Var1, 
      group=as.factor(year), color=as.factor(year)), linetype=2, size=0.9)+ 
    geom_point(aes(x=as.factor(month), y=Var1, group=as.factor(year)))+ 
    geom_line(aes(x=as.factor(month), y=Var2, 
      group=as.factor(year), color=as.factor(year)), linetype=1, size=0.9)+ 
    geom_point(aes(x=as.factor(month), y=Var2, group=as.factor(year)))+ 
    theme_tufte()+ 
    theme(legend.title=element_blank())+ 
    labs(x=NULL,y="",title="Var1 vs. Var2")+ 
    scale_x_discrete(expand=c(0,0.2), 
       labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")) 
plot 

ich habe versucht, die aes innerhalb geom_line ändern, sowie das Hinzufügen & wenige scale_xxx_yyyy der Konfiguration, einschließlich scale_linetype_manual. Alles bisher erfolglos. Idealerweise muss ich meine Legende nicht separat zeichnen, sondern kann sie aus ggplot heraus steuern.

Antwort

1

Dazu müssen wir Ihren Datensatz nur ein wenig ändern. Zuerst werden wir (aus dem tidyr-Paket) Ihre var1 und var2 zusammen sammeln, so dass wir zwei neue Variablen haben, eine var mit den Werten "var1" und "var2" und eine Variable namens n mit den Werten var1 und var2 hätten.

df <- data.frame(year,month,Var1,Var2) %>% 
     gather("var", "n", 3:4) 

dann für jede Kombination von „year“ X „var“ Wir werden eine variable Segment erstellen, die wir, welche Linie gibt ziehen wird.

  • 1 für das Jahr 2015 == & var == var1
  • 2 für das Jahr 2016 == & var == var1
  • 3 für das Jahr 2015 == & var == var2
  • 4 für Jahr == 2016 & var == var2

wie so träge gemacht

df$segment <- rep(1:4, each = 12) 

Jetzt ist es das Ziel, die Linien nach Segmenten zu zeichnen. Dies wird mit der folgenden Schleife

gg <- ggplot() 
for (i in 1:4) gg <- gg + 
    geom_line(data = subset(df, segment == i), 
      aes(x = as.factor(month), y = n, linetype = var, 
       group = as.factor(year), color = as.factor(year))) + 
    geom_point(data = subset(df, segment == i), 
      aes(x = as.factor(month), y = n, group = as.factor(year))) 

Beachten Sie, wie der Unterschied zwischen diesem und Sie waren geschehen, dass die geom_line eine subsetted Dataset Acording zu segmentieren (wir brauchen nur die Daten für die Linie, die wir zeichnen). y = n nach der Versammlung, die wir vorher gemacht haben und jetzt setzen wir eine neue Ästhetik, die unsere Var war. Dies wird 4 mal wiederholt, genauso wie die Anzahl der Segmente.

Schließlich andere Themen und Labors Zugabe

gg <- gg + theme(legend.title = element_blank())+ 
    labs(x = NULL,y = "", title = "Var1 vs. Var2")+ 
    scale_x_discrete(expand = c(0,0.2), 
        labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")) 
gg 

und wir haben das Ergebnis

enter image description here

+0

Aber es wäre gestrichelte Linien auf der Legende mit den blauen und roten schöner sein, wäre es nicht? – Joe

+0

Für dieses Beispiel wäre das egal, da Sie 4 Legendenelemente erhalten würden (pink-full, pink-dotted, blau-full, blue-dotted), aber im Allgemeinen wollen wir jede Ästhetik für sich gruppieren. –

+0

Es sieht gut aus, aber ich bin nicht über den Anfang hinausgekommen, da ich einen Fehler bekomme: Funktion "%>%" konnte nicht gefunden werden. Ist das in einem bestimmten Paket muss ich anrufen? – jesstme

1
year <- c(2015,2015,2015,2015,2015,2015,2015,2015,2015, 
2015,2015,2015,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016) 
month <-c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12) 
Var1 <- sample(30:60, 24, rep=TRUE) 
Var2 <- sample(70:90, 24, rep=TRUE) 
df <- data.frame(year,month,Var1, Var2) 

Wenn Sie das Format ändern von Ihnen ein wenig und durch die Verwendung data.frame Interaktion zu Gruppe 2 Variablen in ggplot2. Bitte schön. Ich benutze data.table, da ich nicht mehr weiß, wie man data.frame zu long transformiert.

library(data.table) 
library (ggplot2) 
ggplot(melt(as.data.table(df),id.vars=c("year","month")))+ 
geom_line(aes(x=as.factor(month), 
y=value, group=interaction(variable, as.factor(year)), 
color=as.factor(year),linetype=variable), size=0.9) + 
labs(x = NULL,y = "", title = "Var1 vs. Var2")+ 
scale_x_discrete(expand = c(0,0.2), 
        labels = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")) 

enter image description here

Verwandte Themen