Supposons que j'ai le graphique suivant dans ggplot :
Il a été généré en utilisant le code ci-dessous :
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()
Je voudrais n'avoir qu'une seule légende qui affiche correctement les formes, les couleurs et les types de lignes (les légendes interaction(Type, Method) sont les plus proches de ce que je voudrais, mais elles n'ont pas les formes/types de lignes corrects).
Je sais que si j'utilise scale_xxx_manual et que je spécifie les mêmes étiquettes pour toutes les légendes, elles seront fusionnées, mais je ne veux pas avoir à définir les étiquettes manuellement : s'il y a de nouvelles méthodes ou de nouveaux types, je ne veux pas avoir à modifier mon code : une envie de quelque chose de générique.
Modifier
Comme indiqué dans les réponses ci-dessous, il y a plusieurs façons de faire le travail dans ce cas particulier. Toutes les solutions proposées nécessitent de définir manuellement les types et les formes des lignes de la légende, soit en utilisant la fonction scale_xxx_manual function
ou avec guides
fonction.
Cependant, les solutions proposées ne fonctionnent toujours pas dans le cas général : par exemple, si j'ajoute un nouveau cadre de données à l'ensemble de données avec une nouvelle méthode "method3", cela ne fonctionne plus, nous devons ajouter manuellement les nouvelles formes de légende et les nouveaux types de lignes :
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)
Cela donne :
La question qui se pose maintenant est la suivante : comment générer automatiquement le fichier override.shape
et override.linetype
des vecteurs ?
Notez que la taille du vecteur est de 5 parce que nous avons 5 courbes, alors que le vecteur interaction(Type, Method)
facteur a la taille 6 (je n'ai pas de données pour la combinaison cos/method3)
2 votes
Votre échelle de couleur est redondante par rapport aux échelles combinées de forme et de type de ligne. Vous ne devriez utiliser qu'une seule de ces échelles.
1 votes
Oui, c'est redondant. Au début, j'avais des couleurs mappées à Type et linetype mappé à Method. Mais ensuite, lorsque les courbes étaient trop proches les unes des autres, il était difficile de les distinguer. D'où la redondance
10 votes
Il est souvent approprié d'avoir des définitions de groupes de formes/couleurs redondantes. Dans de nombreuses publications scientifiques, la couleur est le moyen le plus efficace visuellement de distinguer les groupes, mais vous savez également qu'une grande partie des lecteurs imprimeront des copies en noir et blanc du document, et vous souhaitez donc inclure un indice visuel qui ne dépend pas de la couleur.
0 votes
Cher @Ben Je sais que cette question est ancienne, mais avez-vous obtenu de nouvelles réponses à votre question GÉNÉRALE, ici ?
0 votes
Je crois que ma réponse était aussi proche que possible de la réponse générale... Je n'ai pas cherché plus loin de toute façon