Gavin Rudge
2016-Feb-05 16:19 UTC
[R] Alignment of a double plot where one has a switched axis
Hi Rgonauts, I am plotting 3 variables from one data set on one plot. Two of them as a stacked bar and a ratio on a completely different scale, so I need to put one of the axes on the top of the plot for clarity. Whilst this is not good visualisation practice, there is a valid reason why, in this case, people viewing this plot would be interested in the magnitude of the values in the stacked bars and the distribution of the ratio of them (too complex and dull to go into here). The plot consists of horizontal stacked bars showing two values, with a dot plot showing the ratio of them, all in order of the magnitude of the ratio (this is important). I want them to look something like the code below but with a correct alignment I wanted to avoid something overly complex with grobs as I don't find working with them very intuitive, although this may be the only way. I've codged together this imperfect solution from code I found about the place and was hoping someone could either suggest a much better way or help with the final task of nudging the plots to make them coherent Thanks in advance for any help received. GavinR #here is my code require(ggplot2) require(cowplot) require(reshape2) require(gridExtra) require(grid) #my original data set looks something like this, but with many more values Set.seed=42 df1<-data.frame(idcode=LETTERS[1:10],v1=rnorm(10,mean=30,sd=10),v2=rnorm(10,mean=10,sd=5)) str(df1) df1$rto<-(df1$v1/df1$v2) #melt the frame require(reshape2) df2<-melt(df1,id.vars=c("idcode","rto")) df2 #oder the data by the ratio variable df2$idcode<-reorder(df2$idcode,df2$rto) #make the first plot plot1<-ggplot(df2)+geom_bar(stat="identity",aes(x=idcode,y=value, fill=variable))+theme(legend.position=c(.92,.87))+coord_flip() plot1 #make the second plot plot2<-ggplot(df2)+geom_point(stat="identity",aes(x=idcode,y=rto))+coord_flip()+theme(panel.background = element_rect(fill="transparent"))+coord_flip() plot2 #flip the axis with cowplot plot2<-ggdraw(switch_axis_position(plot2, axis='x')) #plot both on the same page grid.newpage() #create the layout pushViewport(viewport(layout=grid.layout(1,1))) #helper function to get the regions right - no idea what this does but I cribbed it from: #http://www.sthda.com/english/wiki/ggplot2-easy-way-to-mix-multiple-graphs-on-the-same-page-r-software-and-data-visualization#create-a-complex-layout-using-the-function-viewport define_region <- function(row, col){ viewport(layout.pos.row = row, layout.pos.col = col) } #here is the plot print(plot1,vp=define_region(1,1)) print(plot2, vp=define_region(1,1)) #has all the ingredients but how to nudge it?