59 votes

Contrôle de la couleur et du type de ligne dans la légende de ggplot

Arrière-plan

En Allemagne, il y a des 16 états fédéraux, dont dix appartenait à l'Allemagne de l'Ouest, six appartiennent à l'Est de l'Allemagne. À certains égards, par exemple, les taux de mortalité de certains cancers, il y a des divergences persistantes entre les dix anciens états de l'ouest et six anciennes de l'est. Il y a aussi des différences entre les états au sein de leurs groupes respectifs.

Pour montrer les différences entre les états, il peut faire une certaine quantité de sens pour tracer des données, par exemple à l'âge standardisé de mortalité du cancer du sein par an, à partir de chaque état. Une parcelle avec 16 lignes n'est pas toujours un bon choix, et je ne veux pas ouvrir une discussion à ce sujet. Parfois, les pouvoirs en dire que c'est la façon dont il doit être.

Le problème

La différenciation entre 16 lignes sur une parcelle peut être difficile. Pour ce faire, j'ai l'habitude d'utiliser une combinaison de couleurs à partir de la RColorBrewer ensemble (les dix premières couleurs de l' Set3 plus le premier les six couleurs de cette palette de nouveau, correspondant à la dix anciens de l'ouest et six ex-unis) et types de ligne (un type de ligne pour-orient, l'un pour l'ouest). À l'aide de l' lattice package, une parcelle de la, normalisé selon l'âge du cancer du sein taux de mortalité de 1998-2010 par l'état pourrait ressembler à ceci:

xyplot that works

La question

Je voudrais faire un analogue de la parcelle à l'aide de ggplot, mais je n'ai pas compris comment combiner les couleurs et les types de ligne dans la légende. Jusqu'à présent, j'ai reçu ce jour:

unsatisfactory ggplot

Si il est possible de combiner les couleurs et les types de ligne en ggplot légendes, comment fait-on pour le faire?

Voici le code pour créer la trame de données et les parcelles:

mort3 <- structure(list(State = structure(c(8L, 9L, 11L, 12L, 4L, 2L, 
6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 
4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 
11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 
8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 
1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 
14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 
7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 
3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 
6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 
4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 8L, 9L, 
11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 1L, 16L, 
8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 14L, 15L, 
1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 7L, 10L, 
14L, 15L, 1L, 16L, 8L, 9L, 11L, 12L, 4L, 2L, 6L, 13L, 3L, 5L, 
7L, 10L, 14L, 15L, 1L, 16L), class = "factor", .Label = c("SH", 
"HH", "NI", "HB", "NW", "HE", "RP", "BW", "BY", "SL", "BE", "BB", 
"MV", "SN", "ST", "TH")), BCmort = c(16.5, 16.6, 15, 14.4, 13.5, 
17.1, 15.8, 16.3, 18.3, 16.8, 17, 18.1, 13.1, 15.1, 18.8, 13.1, 
16.4, 16.1, 15.8, 12.8, 16.3, 19.2, 16.8, 13, 17.9, 17, 19.4, 
19.4, 13.1, 13.8, 18.1, 13.8, 15.9, 17.3, 17.5, 13.7, 17.4, 17.5, 
16.7, 15.5, 18.1, 18, 20.1, 19.1, 11.8, 14.6, 18.2, 13.4, 16.8, 
17.5, 15.6, 14.1, 13.9, 18.2, 17.1, 15.2, 18.1, 16.6, 19.3, 18.6, 
13.1, 14.6, 19.6, 12.4, 16.6, 17.8, 17.5, 14.3, 20.5, 19.2, 19, 
12.6, 19.5, 17.8, 19.2, 21, 14.4, 13.4, 19.8, 14, 17.5, 18.9, 
16.4, 14.7, 17.7, 20.1, 18.5, 14.5, 19.1, 19.2, 20.1, 19.7, 14.2, 
16.2, 17.9, 12.6, 18, 18.7, 17.7, 16.5, 16.6, 20.3, 18.1, 15.2, 
19, 20, 19.8, 21.3, 13.8, 14.8, 20.4, 14.8, 18.2, 18.7, 16.9, 
16.2, 20.2, 20.4, 18.5, 14, 20.2, 18.7, 20.3, 17.7, 14.4, 14.5, 
21.7, 13.7, 18.3, 19.7, 17.8, 16.5, 20.2, 21.7, 18.8, 16.7, 20.4, 
20, 19.6, 22.9, 15.2, 14.9, 21.7, 14.6, 18.3, 19.7, 17, 16.7, 
22.9, 16.2, 19.6, 15.9, 20.3, 19.9, 18.9, 21.8, 14.9, 18, 21.4, 
16.1, 19.6, 19.2, 19.1, 16.7, 20, 18.2, 20.5, 15.5, 20.5, 21.1, 
21.3, 23.8, 15.8, 15.3, 21.3, 15.7, 19.6, 20.3, 19.2, 17.4, 18.1, 
23.1, 20.6, 16.2, 21.5, 20.3, 21.4, 20.8, 16.1, 15.8, 22.1, 14.5, 
20, 20.2, 19, 18.7, 23.1, 21.8, 19.4, 17.4, 20.9, 20.5, 20.4, 
23.2, 16.3, 17.6, 23.1, 16.5), year = c(2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 
2010, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2008, 2008, 2008, 2008, 2008, 
2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 
2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 
2007, 2007, 2007, 2007, 2007, 2006, 2006, 2006, 2006, 2006, 2006, 
2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2006, 2005, 
2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 
2005, 2005, 2005, 2005, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 
2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2004, 2003, 2003, 
2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 
2003, 2003, 2003, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 1999, 1999, 1999, 1999, 
1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 
1999, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 
1998, 1998, 1998, 1998, 1998, 1998), eastWest = structure(c(1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L), .Label = c("west", 
"east"), class = "factor")), .Names = c("State", "BCmort", "year", 
"eastWest"), class = "data.frame", row.names = c(NA, -208L))

colVec<-c(brewer.pal(10,"Set3"),brewer.pal(6,"Set3"))
ltyVec<-rep(c("solid","dashed"),c(10,6))

ggplot(mort3, aes(x = year, y = BCmort, col = State, lty = eastWest)) +
  geom_line(lwd = 1) +
  scale_linetype_manual(values = c(west = "solid", east = "dashed")) +
  scale_color_manual(values = c(brewer.pal(10, "Set3"), brewer.pal(6, "Set3"))) +
  opts(title = "BC mortality")

xyplot(BCmort ~ year, data = mort3, groups = State, lty = ltyVec,
  type = "l", col = colVec, lwd = 2,
  key = list(lines = list(lty = ltyVec, col = colVec, lwd = 2),
  text = list(levels(mort3$State)), columns = 1,
  space = "right", title = "State"), grid = TRUE, main = "BC mortality")

75voto

Andrie Points 66979

L'astuce consiste à mapper les colour et linetype State , puis à définir scale_linetype_manual avec 16 niveaux:

 ggplot(mort3, aes(x = year, y = BCmort, col = State, linetype = State)) +
  geom_line(lwd = 1) +
  scale_linetype_manual(values = c(rep("solid", 10), rep("dashed", 6))) +
  scale_color_manual(values = c(brewer.pal(10, "Set3"), brewer.pal(6, "Set3"))) +
  opts(title = "BC mortality") +
  theme_bw()
 

entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X