Well, I gave him a chance, but I didnβt make a ton of progress, except that I put the corresponding densities in the same .frame data:
my.barplot <- function( df, title="", legend.title="",... ) { df.count12 <- aggregate( df$outcome, by=list(df$category1,df$category2,df$outcome), FUN=length ) colnames( df.count12 ) <- c("category1","category2","outcome","n") df.total <- aggregate( df.count12$n, by=list(df.count12$category1), FUN=sum ) colnames( df.total ) <- c("category1","total") # Densities within a bar - Categories 1 & 2 df.dens12 <- merge(df.count12, df.total) df.dens12$dens12 <- with( df.dens12, n/total ) # Total bar height - Category 1 density df.count1 <- aggregate( df.dens12$n, by=list(df.dens12$category1,df.dens12$outcome), FUN=sum ) colnames( df.count1 ) <- c("category1","outcome","n") df.dens1 <- merge(df.count1,df.total) df.dens1$dens1 <- with(df.dens1, n/total) # Merge both into the final dataset df.dens <- merge(df.dens12,df.dens1,all.x=TRUE,by=c("category1","outcome")) df.dens <- subset(df.dens, select=c(-total.x) ) colnames( df.dens ) <- sub("\\.x","12",colnames(df.dens)) colnames( df.dens ) <- sub("\\.y","1",colnames(df.dens)) # Plot ymax <- max(df.dens$dens1) # Plot 1: category1 p <- ggplot( df.dens, aes( x=outcome, fill=category1 ), ... ) p1 <- p + geom_bar( aes( y=dens1 ), position="dodge" ) p1 <- p1 + opts( axis.text.x=theme_text(angle=-90,hjust=0), title=title ) if(legend.title!="") { p1 <- p1 + scale_colour_discrete(name=legend.title) } # Plot 2: category2 p2 <- p1 + geom_bar( aes( y=dens12, fill=category2 ), position="stack", stat="identity" ) p2 } N <- 50*(2*8*2) outcome <- sample(ordered(seq(8)),N,replace=TRUE,prob=c(seq(4)/20,rev(seq(4)/20)) ) category2 <- ifelse( outcome==1, sample(c("yes","not"), prob=c(.95,.05)), sample(c("yes","not"), prob=c(.35,.65)) ) dat <- data.frame( category1=rep(c("in","out"),each=N/2), category2=category2, outcome=outcome ) my.barplot(dat, title="Test title", legend.title="Medical system")
Comparing my attempts with the link, itβs clear that it puts the third dimension (x = result, dodge = category1, stack = category2) along with using the grid layout, while I really need the third dimension laid out in the second dimension. I think I may have come to the point that ggplot2 is being tormented too much, and I should just write a function using the basic graphics. Woe