Angenommen, ich habe folgendes Grundstück in ggplot:Wie Farbe, Linienstil und Form Legenden in ggplot verschmelzen
Es erzeugt wurde unter Verwendung des Codes:
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()
würde ich Ich möchte nur eine Legende haben, die die Formen, die Farben und die Linientypen korrekt anzeigt (die Interaktion (Typ, Methode) Legenden ist am nächsten zu dem, was ich möchte, aber es hat nicht die richtigen Formen/Linientypen).
Ich weiß, dass, wenn ich scale_xxx_manual verwenden und ich die gleichen Beschriftungen für alle Legenden angeben, werden sie zusammengeführt, aber ich möchte die Beschriftungen nicht manuell festlegen: Wenn es neue Methoden oder Typen gibt, ich don Ich möchte meinen Code ändern müssen: a wollen etwas Generisches.
bearbeiten
Wie unten Antworten darauf gibt es mehrere Möglichkeiten, um die Arbeit in diesem speziellen Fall getan. Alle vorgeschlagenen Lösungen erfordern die manuelle Festlegung der Legendientypen und -formen, entweder mithilfe der Funktion scale_xxx_manual function
s oder mit der Funktion guides
.
Die vorgeschlagenen Lösungen funktionieren jedoch im allgemeinen Fall immer noch nicht: Wenn ich beispielsweise einen neuen Datenrahmen mit einer neuen "method3" -Methode zum Datensatz hinzufüge, funktioniert das nicht mehr, wir müssen manuell hinzufügen die neue Legende Formen 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 ist die Frage: wie automatisch erzeugen die override.shape
und override.linetype
Vektoren?
Beachten Sie, dass die Vektorgröße 5 ist, weil wir 5 Kurven haben, während der interaction(Type, Method)
Faktor Größe 6 (Ich habe keine Daten für die cos/method3 Kombination)
Ihre Farbskala ist redundant zu den kombinierten Form- und Linientypskalen. Sie sollten nur einen von diesen verwenden. – Roland
Ja, es ist redundant. Zuerst wurden Farben dem Typ und Linientyp der Methode zugeordnet. Aber dann, wenn Kurven zu nahe beieinander waren, war es schwer, sie auseinander zu halten. Daher ist die Redundanz – Ben
Es ist oft angemessen, redundante Form-/Farbgruppendefinitionen zu haben. In vielen wissenschaftlichen Veröffentlichungen ist Farbe der visuell effektivste Weg, um Gruppen zu unterscheiden, aber Sie wissen auch, dass ein großer Teil der Leser Schwarz-Weiß-Kopien des Papiers drucken wird. Daher möchten Sie auch einen visuellen Hinweis einfügen, der nicht t abhängig von der Farbe. – neuropsych