[R] ggplot2: further query about back to back bar plots

Rui Barradas ruipbarradas at sapo.pt
Thu Jul 25 20:34:46 CEST 2013


I'm not an expert in ggplot2 graphics but I can (partly) answer to your 
first question. Inline.

Em 25-07-2013 18:30, Gavin Rudge escreveu:
> Further to my recent post on this topic and thanks to help received already (thanks BTW), I've got back-to-back plots working nicely to give me population pyramids, with some overlaid point data from a different time period, using the code below.
> #packages
> library(ggplot2)
> library(reshape2)
> library(plyr)
> #sample data
> set.seed(33)
> df<-data.frame(ag=c(1:18),males_year1=sample(100:200,18),females_year1=sample(100:200,18),males_year2=sample(100:200,18),females_year2=sample(100:200,18))
> #melt the data set
> df<-data.frame(melt(df,id="ag"))
> df
> #here is the plot
> p<-ggplot(df)+
>    geom_bar(subset=.(df$variable=="males_year1"),stat="identity",aes(x=ag,y=value),fill="#6666FF")+
>    geom_bar(subset=.(df$variable=="females_year1"),stat="identity",aes(x=ag,y=-value),fill="#FF9333")+
>    geom_point(subset=.(df$variable=="males_year2"),stat="identity",aes(x=ag,y=value),size=3,colour="#330099")+
>    geom_point(subset=.(df$variable=="females_year2"),stat="identity",aes(x=ag,y=-value),size=3,colour="#CC3300")+
>    coord_flip()+
>    theme_bw()+
>    scale_y_continuous(limits=c(-200,200),breaks=seq(-200,200,50),labels=abs(seq(-200,200,50)))+
>    scale_x_continuous(limits=c(0,19),breaks=seq(1,18,1),labels=abs(seq(1,18,1)))+
>    xlab("age group")+ylab("population")+
>    theme_bw()+
>    xlab("age group")+
>    ylab("population")+
>    geom_text(y=-100,x=19.2,label="Females")+
>    geom_text(y=100,x=19.2,label="Males")
> p
> Two questions remaining.  Firstly have I used a large amount of code to acheive this or is this about right for the effect that I'm after?

You have repeated some code, the following lines show up twice.

   xlab("age group")+

Hope this helps,

Rui Barradas
> Secondly I'm quite confused about how to put a legend onto a plot like this. I'm getting slowly into the ggplot way of doing things, but I'm totally baffled by legends; say I wanted a legend with an appropriate label for both genders and both time periods showing the colours of the bars and dots I've used here as examples, how do I do this?  I've tried scale_fill with a bunch of arguments to no avial.  I'm confused about where in the hierarchy of ggplot commands you actually build the legend and how you map it to your data.  The usual trawl of the package pdf / cook book for R etc hasn't really helped. Can someone show me how to do this please?
> Many thanks.
> Gavin.
> ______________________________________________
> 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.

More information about the R-help mailing list