2017-02-04 5 views
1

Ich versuche, zwei separate Legenden für zwei Datenreihen zu haben. Grundsätzlich habe ich eine Datenreihe und Regressionslinien, und ich möchte eine Legende mit den Regressionsdaten, vorzugsweise mit dem adrr2 berichtet, und eine andere Legende mit den Punkten aus dem Datensatz. Ich bin neu bei ggplot2 und konnte keine Guides (guide_legend) herausfinden.Hinzufügen einer zweiten Legende zu einem ggplot2-Graphen - Datenpunkte und Regressionslinien

Hier ist mein Code. Ich habe es geschafft, nur die Punkte zu bekommen, die auf der Legende angezeigt werden, deshalb möchte ich einen zweiten für die gestrichelten Regressionslinien erstellen. Ich habe eine Spalte für die angepassten r2-Werte, die ich für die 2. Legende aufrufen möchte.

g <- ggplot(acci_bud, aes(x = Elevation, y = DOY, color = Year)) + 
     geom_errorbar(aes(ymin = DOY -se, ymax = DOY +se), width = .1, show.legend = F) 
g <- g + geom_point() 
g <- g + geom_abline(data = acci_elev_slope, aes(slope = slope_coeff, 
    intercept = slope_int, color = year),linetype = 'dashed', show.legend = F) 

plot I've managed to make, minus the second legend

kann ich dieses Grundstück mit dem Basispaket machen, aber ich möchte in der Lage sein, ein einfaches Skript zu haben, die ich für mehrere Datensätze verwenden und ich denke, ggplot2 dazu förderlicher ist.

base package plot, goal is something similar to this using ggplot2

EDIT: sollte reproduzierbar sein:

acci_bud <- data.frame( Elevation = rep((seq(from = 500, to = 1250, by = 50)),7), 
        DOY = sample(75:180, 112, replace = TRUE), 
        Year = rep(2009:2015, each = 16), 
        se = 2) 

acci_elev_slope <- data.frame (year = seq(from = 2009, to = 2015, by = 1), 
        slope_coeff = c(0.05, 0.03, 0.051, 0.030, 0.025, 0.025, 0.034), 
        slope_int = c(75.76, 79.52, 81.80, 92.71, 75.76, 72.07, 90.6),        
        adjr2 = c(0.87, 0.79, 0.65, 0.89, 0.20, 0.57, 0.90)) 


acci_bud$Year <- as.factor(acci_bud$Year) 
acci_elev_slope$year <- as.factor(acci_elev_slope$year) 

g <- ggplot(acci_bud, aes(x = Elevation, y = DOY, color = Year)) + 
     geom_errorbar(aes(ymin = DOY -se, ymax = DOY +se), width = 0.1, show.legend = F) 
g <- g + geom_point() 
g <- g + geom_abline(data = acci_elev_slope, 
        aes(slope = slope_coeff, intercept = slope_int, color = year), 
        linetype = 'dashed', show.legend = F) 
g 
+2

Geben Sie ein reproduzierbares Beispiel mit einigen eingebauten Datensätzen an. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-beispiel – Koundy

Antwort

0

Sie diese Schicht durch Zugabe einer gefälschten fill Legende zu den Punkten erreichen konnte und mit show.legend = TRUE in geom_abline. Dann können Sie durch die Auswahlrahmen springen, um den Titel/das Label der neuen Legende festzulegen, die Farben für beide Legenden festzulegen und dann zu überschreiben, wie die Legenden über override.aes in guide_legend aussehen.

ggplot(acci_bud, aes(x = Elevation, y = DOY, color = Year)) + 
    geom_errorbar(aes(ymin = DOY -se, ymax = DOY +se), width = 0.1, show.legend = FALSE) + 
    geom_point(aes(fill = Year)) + 
    geom_abline(data = acci_elev_slope, 
       aes(slope = slope_coeff, intercept = slope_int, 
        color = year), linetype = "dashed", show.legend = TRUE) + 
    scale_fill_discrete(name = "slopes", labels = acci_elev_slope$slope_coeff) + 
    scale_color_manual(values = rainbow(length(unique(acci_bud$Year)))) + 
    guides(color = guide_legend(override.aes = list(linetype = 0)), 
      fill = guide_legend(override.aes = list(shape = NA, 
              color = rainbow(length(unique(acci_bud$Year)))))) 
+0

Schön! Vielen Dank, das hat perfekt funktioniert. – sarahw

+0

Ist es möglich, die Linien alle einen Typ zu machen? Ich mag es, dass sie in der Legende zerschmettert sind, aber ich verstehe den Override nicht genug, um alle Linien in der Handlung so zu gestalten, dass sie einfach nur zertrümmert sind. – sarahw

+0

Sie können Dinge mit 'fill' anstelle von' linetype' nutzen. – aosmith

Verwandte Themen