Sunday, 15 April 2012

r - Arrange many plots using gridExtra -



r - Arrange many plots using gridExtra -

i have spent many hours trying fit 11 graphs in 1 plot , arrange them using gridextra have failed miserably, turn hoping can help.

i have 11 classifications of diamonds (call size1) , other 11 classifications (size2) , want plot how median cost each increasing size1 , increasing clarity (from 1 6) varies increasing size2 of diamonds, , plot 11 plots in same graph. tried using gridextra suggested in other posts legend far away right , graphs squished left, can please help me figure out how "widths" legend in gridextra has specified? cannot find explanations. give thanks much help, appreciate it...

i have been trying find illustration recreate info frame failed in well. hope info frame helps understand trying do, not work , same mine , plots don't have plenty data, of import part disposition of graphs using gridextra (although if have other comments on other parts please allow me know):

library(ggplot2) library(gridextra) df <- data.frame(price=matrix(sample(1:1000, 100, replace = true), ncol = 1)) df$size1 = 1:nrow(df) df$size1 = cut(df$size1, breaks=11) df=df[sample(nrow(df)),] df$size2 = 1:nrow(df) df$size2 = cut(df$size2, breaks=11) df=df[sample(nrow(df)),] df$clarity = 1:nrow(df) df$clarity = cut(df$clarity, breaks=6) # create 1 graph each size1, plotting median cost vs. size2 clarity: (c in 1:length(table(df$size1))) { mydf = df[df$size1==names(table(df$size1))[c],] mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median); names(mydf)[1] = 'size2' names(mydf)[2] = 'clarity' names(mydf)[3] = 'median_price' assign(paste("p", c, sep=""), qplot(data=mydf, x=as.numeric(mydf$size2), y=mydf$median_price, group=as.factor(mydf$clarity), geom="line", colour=as.factor(mydf$clarity), xlab = "number of samples", ylab = "median price", main = paste("region number ",c, sep=''), plot.title=element_text(size=10)) + scale_colour_discrete(name = "clarity") + theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), axis.title.y=element_text(size = rel(0.8)) , axis.text.x=element_text(size=8),axis.text.y=element_text(size=8) )) } # couldnt work, use: p5=p4 p6=p4 p7=p4 p8=p4 p9=p4 # utilize gridextra arrange 11 plots: g_legend<-function(a.gplot){ tmp <- ggplot_gtable(ggplot_build(a.gplot)) leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") legend <- tmp$grobs[[leg]] return(legend)} mylegend<-g_legend(p1) grid.arrange(arrangegrob(p1 + theme(legend.position="none"), p2 + theme(legend.position="none"), p3 + theme(legend.position="none"), p4 + theme(legend.position="none"), p5 + theme(legend.position="none"), p6 + theme(legend.position="none"), p7 + theme(legend.position="none"), p8 + theme(legend.position="none"), p9 + theme(legend.position="none"), p10 + theme(legend.position="none"), p11 + theme(legend.position="none"), main ="main title", left = ""), mylegend, widths=unit.c(unit(1, "npc") - mylegend$width, mylegend$width), nrow=1)

i had alter qplot loop phone call (i.e. set factors in info frame) throwing mismatched size error. i'm not including bit since part working in environment or errant paste.

try adjusting widths units this:

widths=unit(c(1000,50),"pt")

and you'll bit closer expecting:

and, can paste code few months later :-)

library(ggplot2) library(gridextra) df <- data.frame(price=matrix(sample(1:1000, 100, replace = true), ncol = 1)) df$size1 = 1:nrow(df) df$size1 = cut(df$size1, breaks=11) df=df[sample(nrow(df)),] df$size2 = 1:nrow(df) df$size2 = cut(df$size2, breaks=11) df=df[sample(nrow(df)),] df$clarity = 1:nrow(df) df$clarity = cut(df$clarity, breaks=6) # create 1 graph each size1, plotting median cost vs. size2 clarity: (c in 1:length(table(df$size1))) { mydf = df[df$size1==names(table(df$size1))[c],] mydf = aggregate(mydf$price, by=list(mydf$size2, mydf$clarity),median); names(mydf)[1] = 'size2' names(mydf)[2] = 'clarity' names(mydf)[3] = 'median_price' mydf$clarity <- factor(mydf$clarity) assign(paste("p", c, sep=""), qplot(data=mydf, x=as.numeric(size2), y=median_price, group=clarity, geom="line", colour=clarity, xlab = "number of samples", ylab = "median price", main = paste("region number ",c, sep=''), plot.title=element_text(size=10)) + scale_colour_discrete(name = "clarity") + theme_bw() + theme(axis.title.x=element_text(size = rel(0.8)), axis.title.y=element_text(size = rel(0.8)), axis.text.x=element_text(size=8), axis.text.y=element_text(size=8) )) } # utilize gridextra arrange 11 plots: g_legend<-function(a.gplot){ tmp <- ggplot_gtable(ggplot_build(a.gplot)) leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") legend <- tmp$grobs[[leg]] return(legend)} mylegend<-g_legend(p1) grid.arrange(arrangegrob(p1 + theme(legend.position="none"), p2 + theme(legend.position="none"), p3 + theme(legend.position="none"), p4 + theme(legend.position="none"), p5 + theme(legend.position="none"), p6 + theme(legend.position="none"), p7 + theme(legend.position="none"), p8 + theme(legend.position="none"), p9 + theme(legend.position="none"), p10 + theme(legend.position="none"), p11 + theme(legend.position="none"), top ="main title", left = ""), mylegend, widths=unit(c(1000,50),"pt"), nrow=1)

edit (16/07/2015): gridextra >= 2.0.0, main parameter has been renamed top.

r ggplot2 gridextra

No comments:

Post a Comment