Wie man Farben, Linien und Formlegenden in ggplot zusammenfügt
Angenommen, ich habe das folgende Diagramm in ggplot:
Es wurde mit dem folgenden Code generiert:
x <- seq(0, 10, by = 0.2)
y1 <- sin(x)
y2 <- cos(x)
y3 <- cos(x + pi / 4)
y4 <- sin(x + pi / 4)
df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1"))
df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1"))
df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2"))
df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2"))
df.merged <- rbind(df1, df2, df3, df4)
ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()
Ich möchte nur eine Legende haben, die die Formen, Farben und Linientypen korrekt anzeigt (die Legenden für die Interaktion (Typ, Methode) entsprechen meinen Vorstellungen am ehesten, aber sie haben nicht die richtigen Formen / Linientypen ).
Ich weiß, dass wenn ich scale_xxx_manual verwende und für alle Legenden die gleichen Bezeichnungen angeben, diese zusammengeführt werden, aber ich möchte die Bezeichnungen nicht manuell festlegen müssen:wenn es neue Methoden oder Typen gibt, möchte ich meinen Code nicht ändern müssen: etwas generisches wollen.
BearbeiteWie in den folgenden Antworten angegeben, gibt es in diesem speziellen Fall mehrere Möglichkeiten, die Aufgabe zu erledigen. Bei allen vorgeschlagenen Lösungen müssen Sie die Legendenlinientypen und -formen manuell festlegen, indem Sie entweder @ verwendescale_xxx_manual function
s oder mitguides
Funktion.
Die vorgeschlagenen Lösungen funktionieren jedoch im Allgemeinen immer noch nicht: Wenn ich dem Datensatz beispielsweise mit einer neuen "method3" -Methode einen neuen Datenrahmen hinzufüge, funktioniert dies nicht mehr, und wir müssen den manuell hinzufügen Neue Legendenformen und Linientypen:
y5 <- sin(x - pi / 4)
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3"))
df.merged <- rbind(df1, df2, df3, df4, df5)
override.shape <- c(16, 17, 16, 17, 16)
override.linetype <- c(1, 1, 3, 3, 4)
g <- ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()
g <- g + guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype)))
g <- g + scale_shape(guide = FALSE)
g <- g + scale_linetype(guide = FALSE)
print(g)
Das gibt
Nun stellt sich die Frage, wie das @ automatisch generiert wiroverride.shape
undoverride.linetype
vectors?
Beachten Sie, dass die Vektorgröße 5 ist, da wir 5 Kurven haben, während dasinteraction(Type, Method)
Faktor hat Größe 6 (ich habe keine Daten für die Kombination aus cos / method3)