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.

Bearbeite

Wie 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 functions 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)

Antworten auf die Frage(10)

Ihre Antwort auf die Frage