2017-09-26 1 views
0

Ich habe ein ggplot2 Liniendiagramm aus drei Datenrahmen, für die ich das Farbschema gesteuert habe. Ich habe stattdessen linetype verwendet, um zwischen den Zeilen zu unterscheiden. Dies führt dazu, dass eine Legende nicht automatisch generiert wird. Wie kann ich eine Legende für dieses Diagramm erstellen?Hinzufügen von Legende zu ggplot aus mehreren Datenrahmen mit kontrollierten Farben

tpAct <- data.frame(
    Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'), 
    Reg1=rnorm(5, 10, 5), 
    Reg2=rnorm(5, 15, 5), 
    Reg3=rnorm(5, 20, 5), 
    Reg4=rnorm(5, 25, 5), 
    Reg5=rnorm(5, 30, 5), 
    Total=rnorm(5, 60, 5) 
) 

tpOL <- data.frame( 
    Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'), 
    Reg1=rnorm(5, 10, 5), 
    Reg2=rnorm(5, 25, 5), 
    Reg3=rnorm(5, 20, 5), 
    Reg4=rnorm(5, 25, 5), 
    Reg5=rnorm(5, 30, 5), 
    Total=rnorm(5, 60, 5) 
) 

tpModL2 <- data.frame( 
    Date=seq.Date(as.Date('2017-09-01'), as.Date('2018-01-01'),by='month'), 
    Reg1=rnorm(5, 10, 5), 
    Reg2=rnorm(5, 25, 5), 
    Reg3=rnorm(5, 20, 5), 
    Reg4=rnorm(5, 25, 5), 
    Reg5=rnorm(5, 30, 5), 
    Total=rnorm(5, 60, 5) 
) 

ggplot() + 
    geom_line(data=tpAct, aes(x=Date, y=Reg1), color='red', size=1.25) + 
    geom_line(data=tpAct, aes(x=Date, y=Reg2), color='blue', size=1.25) + 
    geom_line(data=tpAct, aes(x=Date, y=Reg3), color='green', size=1.25) + 
    geom_line(data=tpAct, aes(x=Date, y=Reg4), color='pink', size=1.25) + 
    geom_line(data=tpAct, aes(x=Date, y=Reg5), color='yellow', size=1.25) + 
    geom_line(data=tpAct, aes(x=Date, y=Total), color='black', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Reg1), linetype=5, color='red', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Reg2), linetype=5, color='blue', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Reg3), linetype=5, color='green', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Reg4), linetype=5, color='pink', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Reg5), linetype=5, color='yellow', size=1.25) + 
    geom_line(data=tpOL, aes(x=Date, y=Total), linetype=5, color='black', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Reg1), linetype=4, color='red', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Reg2), linetype=4, color='blue', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Reg3), linetype=4, color='green', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Reg4), linetype=4, color='pink', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Reg5), linetype=4, color='yellow', size=1.25) + 
    geom_line(data=tpModL2, aes(x=Date, y=Total), linetype=4, color='black', size=1.25) + 
    labs(x='', y='Total Balances ($B)') 

enter image description here

+0

Ich denke, wenn Sie richtig in Ihre Daten formatiert " lang "Format, können Sie nur die Datenquelle zu' Linientype' zuordnen und Sie werden Ihre Legende haben. – Mako212

+0

Sie können diesen Plot mit einem einzigen Aufruf von 'geom_line' machen.Um dies zu tun, (1) wandeln Sie die einzelnen Datenrahmen in ein langes Format um, (2) stapeln Sie die einzelnen Datenrahmen in einen einzelnen Datenrahmen und fügen Sie eine Indikatorspalte hinzu, um den Namen des Quelldatenrahmens zu markieren. Dann können Sie den Quelldatenrahmen dem Linientyp und "Reg" der Farbe zuordnen, wodurch Sie eine Legende erhalten und den benötigten Code drastisch reduzieren. Wenn Sie Beispiele für jeden Ihrer drei Datenrahmen bereitstellen, können wir Ihnen einen Code zur Verfügung stellen, der Ihnen zeigt, wie Sie dies tun. – eipi10

+0

@GauravBansal Sie müssen Ihre Daten posten – PoGibas

Antwort

3

Hier ist, wie die Daten stapeln und zeichnen Sie den Beispieldatenrahmen unter Verwendung von Ihnen zur Verfügung gestellten:

library(tidyverse) 

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2")) %>% 
    map_df(~ .x %>% gather(key, value, -Date), .id="source") %>% 
    ggplot(aes(Date, value, colour=key, linetype=source)) + 
    geom_line() + 
    scale_colour_manual(values=c('red','blue','green','pink', 'yellow', 'black')) + 
    theme_classic() 

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2")) stellt die drei Datenrahmen in einer Liste und ordnet die Daten Frame-Namen wie die Namen der Listenelemente.

map_df(~ .x %>% gather(key, value, -Date), .id="source") wandelt die einzelnen Datenrahmen in ein langes Format um und stapelt sie in einem einzigen langen Datenrahmen.

Hier ist, was die Handlung wie folgt aussieht:

enter image description here

Ein facettierten Grundstück könnte einfacher sein, zu lesen:

setNames(list(tpAct, tpOL, tpModL2), c("tpAct","tpOL","tpModL2")) %>% 
    map_df(~ .x %>% gather(key, value, -Date), .id="source") %>% 
    ggplot(aes(Date, value, colour=key)) + 
    geom_line() + 
    scale_colour_manual(values=c('red','blue','green','pink', 'yellow', 'black')) + 
    theme_classic() + 
    facet_grid(~ source) 

enter image description here

+0

Danke. Gibt es eine Möglichkeit, die Legende so zu kombinieren, dass "tpActReg1" steht und als rote durchgezogene Linie angezeigt wird, "tpModL2Reg1" und eine rote gestrichelte Linie zeigt, und so weiter? –

+0

Sie können dies mit 'ggplot (aes (Datum, Wert, Farbe = Interaktion (Quelle, Schlüssel), Linientyp = Interaktion (Quelle, Schlüssel))) 'tun, aber die Legende wird 18 Einträge haben und Sie müssen tun einige zusätzliche Arbeiten mit 'scale_colour_manual' und' scale_linetype_manual', um die Linientypen und Farben so zu gestalten, wie Sie es möchten. – eipi10

1

Wenn Sie sich eine Legende mit ggplot2 manuell hinzufügen, finden zu wollen, habe ich es in der Regel gefunden bedeutet, dass Sie in einer Art und Weise andere als das, was ggplot2 sollte über die Sie Ihre Handlung gehen.

Um ggplot zu generieren, um eine Legende für dieses Diagramm zu generieren, müssen Sie Ihre Daten in ein langes Format mit Gruppen umformen, bevor Sie es ggplot geben.

Sie wollen alle drei Datensätze (tpAct(), tpOL(), tpModL2() - ich nehme an, dass diese Funktionen sind, die Datenrahmen zurückgeben) in eine einzige data.frame - Let's kombinieren nenne diese kombinierten Daten. Die Spalten wären dann: Datensatz (um anzugeben, aus welchem ​​Satz die Beobachtung besteht), Datum, RegTyp (Reg1, Reg2, .. Gesamt) und Wert (die tatsächlichen y-Werte, die Sie zeichnen).

Dann könnten Sie ein Grundstück mit so etwas wie das schaffen folgende:

ggplot(combineddata, aes(x=Date, y=Value, color=RegType, linetype=dataset) + 
    geom_line() 

Diese eine Zeile für jede Kombination von Regressions zu ziehen und Daten festgelegt, wie Sie oben haben, aber dies automatisch tun und eine Legende erstellen . Wenn Sie nicht wie die Farben und Linientypen, die ggplot Picks für Sie, Sie zusätzlich angeben können, die spezifischen Farben und Linientypen, die Sie mit Skalen verwenden möchten:

ggplot(combineddata, aes(x=Date, y=Value, color=RegType, linetype=dataset) + 
    geom_line() + 
    scale_color_manual(values = c("red", "blue", "green", "pink", "yellow", "black")) + 
    scale_linetype_manual(values = c(1, 5, 4) 

Sie müssen explizit können RegType und dataset machen geordnete Faktoren vor dem Senden der Daten an ggplot, um sie in der richtigen Reihenfolge zu erhalten, oder ändern Sie die Reihenfolge der Farben und Linientypen oben.

Verwandte Themen