Dear All, I am trying to build a stacked bar plot, where I define the colours to use. I have asked this before, and I was using a solution in http://thread.gmane.org/gmane.comp.lang.r.general/100649/focus=100673 (thanks, Thierry). However, it looks this works only when the data are in the sequence of the levels in the factor defining the fill colours. When the sequence is different, the legend gets "scrambled", in that the order of the colours does not match the labels. My code is below. Can anyone tell me how to get around this? (R 2.2.6 for Windows, ggplot2 version 2_0.5.7) Thanks, Pedro library(ggplot2) Data: > plotdata2 x y group 1 1 0.1 grey30 2 2 0.2 grey30 3 3 0.3 grey10 4 4 0.4 grey90 5 1 0.1 grey30 6 2 0.2 grey60 7 3 0.3 grey60 8 4 0.4 grey90 9 1 0.1 grey60 10 2 0.2 grey10 11 3 0.3 grey90 12 4 0.4 grey30 13 1 0.1 grey90 14 2 0.2 grey60 15 3 0.3 grey10 16 4 0.4 grey10 > levels(plotdata2$group) [1] "grey10" "grey30" "grey60" "grey90" > as.numeric(plotdata2$group) [1] 2 2 1 4 2 3 3 4 3 1 4 2 4 3 1 1 Code: plot0<-ggplot() layer1<-layer(data=plotdata2, mapping=aes_string(x='x',y='y', fill='group'),geom='bar', stat='identity', position='stack') scaleFill<-scale_fill_identity(labels=levels(plotdata2$group), guide='tile', name='Group') scaleY<-scale_y_continuous(limits=c(0,4), expand=c(0,0)) plot1<-plot0+layer1 +scaleFill +scaleY plot1
ggplot2 - legend for fill coulours
3 messages · Pedro de Barros, ONKELINX, Thierry
1 day later
Dear Pedro, Sorting your data before plotting it will probably sort your problem. plotdata2 <- plotdata2[order(plotdata2$group), ] HTH, Thierry ------------------------------------------------------------------------ ---- ir. Thierry Onkelinx Instituut voor natuur- en bosonderzoek / Research Institute for Nature and Forest Cel biometrie, methodologie en kwaliteitszorg / Section biometrics, methodology and quality assurance Gaverstraat 4 9500 Geraardsbergen Belgium tel. + 32 54/436 185 Thierry.Onkelinx op inbo.be www.inbo.be To call in the statistician after the experiment is done may be no more than asking him to perform a post-mortem examination: he may be able to say what the experiment died of. ~ Sir Ronald Aylmer Fisher The plural of anecdote is not data. ~ Roger Brinner The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. ~ John Tukey -----Oorspronkelijk bericht----- Van: r-help-bounces op r-project.org [mailto:r-help-bounces op r-project.org] Namens Pedro de Barros Verzonden: zondag 23 maart 2008 13:02 Aan: r-help op stat.math.ethz.ch Onderwerp: [R] ggplot2 - legend for fill coulours Urgentie: Hoog Dear All, I am trying to build a stacked bar plot, where I define the colours to use. I have asked this before, and I was using a solution in http://thread.gmane.org/gmane.comp.lang.r.general/100649/focus=100673 (thanks, Thierry). However, it looks this works only when the data are in the sequence of the levels in the factor defining the fill colours. When the sequence is different, the legend gets "scrambled", in that the order of the colours does not match the labels. My code is below. Can anyone tell me how to get around this? (R 2.2.6 for Windows, ggplot2 version 2_0.5.7) Thanks, Pedro library(ggplot2) Data: > plotdata2 x y group 1 1 0.1 grey30 2 2 0.2 grey30 3 3 0.3 grey10 4 4 0.4 grey90 5 1 0.1 grey30 6 2 0.2 grey60 7 3 0.3 grey60 8 4 0.4 grey90 9 1 0.1 grey60 10 2 0.2 grey10 11 3 0.3 grey90 12 4 0.4 grey30 13 1 0.1 grey90 14 2 0.2 grey60 15 3 0.3 grey10 16 4 0.4 grey10 > levels(plotdata2$group) [1] "grey10" "grey30" "grey60" "grey90" > as.numeric(plotdata2$group) [1] 2 2 1 4 2 3 3 4 3 1 4 2 4 3 1 1 Code: plot0<-ggplot() layer1<-layer(data=plotdata2, mapping=aes_string(x='x',y='y', fill='group'),geom='bar', stat='identity', position='stack') scaleFill<-scale_fill_identity(labels=levels(plotdata2$group), guide='tile', name='Group') scaleY<-scale_y_continuous(limits=c(0,4), expand=c(0,0)) plot1<-plot0+layer1 +scaleFill +scaleY plot1 ______________________________________________ R-help op r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Dear Thierry, Thanks, it worked. I though the algorithm behind the plotting uses some approach like unique(), so that the order of the plot is that of the first occurrence of each code, but I could not get into the code to modify this. Anyway, Hadley has already gently volunteered to look into this for a more permanent solution, I look forward to it, as I really like the ggplot philosophy... Thanks again, Pedro
At 09:24 2008/03/25, you wrote:
Dear Pedro, Sorting your data before plotting it will probably sort your problem. plotdata2 <- plotdata2[order(plotdata2$group), ] HTH, Thierry ------------------------------------------------------------------------ ---- ir. Thierry Onkelinx Instituut voor natuur- en bosonderzoek / Research Institute for Nature and Forest Cel biometrie, methodologie en kwaliteitszorg / Section biometrics, methodology and quality assurance Gaverstraat 4 9500 Geraardsbergen Belgium tel. + 32 54/436 185 Thierry.Onkelinx at inbo.be www.inbo.be To call in the statistician after the experiment is done may be no more than asking him to perform a post-mortem examination: he may be able to say what the experiment died of. ~ Sir Ronald Aylmer Fisher The plural of anecdote is not data. ~ Roger Brinner The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. ~ John Tukey -----Oorspronkelijk bericht----- Van: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] Namens Pedro de Barros Verzonden: zondag 23 maart 2008 13:02 Aan: r-help at stat.math.ethz.ch Onderwerp: [R] ggplot2 - legend for fill coulours Urgentie: Hoog Dear All, I am trying to build a stacked bar plot, where I define the colours to use. I have asked this before, and I was using a solution in http://thread.gmane.org/gmane.comp.lang.r.general/100649/focus=100673 (thanks, Thierry). However, it looks this works only when the data are in the sequence of the levels in the factor defining the fill colours. When the sequence is different, the legend gets "scrambled", in that the order of the colours does not match the labels. My code is below. Can anyone tell me how to get around this? (R 2.2.6 for Windows, ggplot2 version 2_0.5.7) Thanks, Pedro library(ggplot2) Data:
> plotdata2
x y group 1 1 0.1 grey30 2 2 0.2 grey30 3 3 0.3 grey10 4 4 0.4 grey90 5 1 0.1 grey30 6 2 0.2 grey60 7 3 0.3 grey60 8 4 0.4 grey90 9 1 0.1 grey60 10 2 0.2 grey10 11 3 0.3 grey90 12 4 0.4 grey30 13 1 0.1 grey90 14 2 0.2 grey60 15 3 0.3 grey10 16 4 0.4 grey10
> levels(plotdata2$group)
[1] "grey10" "grey30" "grey60" "grey90"
> as.numeric(plotdata2$group)
[1] 2 2 1 4 2 3 3 4 3 1 4 2 4 3 1 1 Code: plot0<-ggplot() layer1<-layer(data=plotdata2, mapping=aes_string(x='x',y='y', fill='group'),geom='bar', stat='identity', position='stack') scaleFill<-scale_fill_identity(labels=levels(plotdata2$group), guide='tile', name='Group') scaleY<-scale_y_continuous(limits=c(0,4), expand=c(0,0)) plot1<-plot0+layer1 +scaleFill +scaleY plot1
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.