[R] Barplot2 using for loop, how to adjust margins?
Lauri Nikkinen
lauri.nikkinen at iki.fi
Fri Aug 31 10:55:52 CEST 2007
Hi,
Marc got me on the right track. This is probably not the most elegant
solution but works for me. Changes to the code are here:
maxim <- max(strwidth(as.character(spl[[i]]$os), units="inches"))*4
opar <- par(mar=c(3,maxim,0,2), bg="white", cex=1, oma = c(0, 0, 2, 0),
And the whole script:
for (i in names(spl)) {
maxim <- max(strwidth(as.character(spl[[i]]$os), units="inches"))*4
opar <- par(mar=c(3,maxim,0,2), bg="white", cex=1, oma =
c(0, 0, 2, 0), mgp=c(3,0.5,0))
.order <- order(spl[[i]]$x)
barplot2(spl[[i]]$x[.order],
names.arg=as.character(spl[[i]]$osasto[.order]),
horiz=TRUE,
las=1,
cex.names=0.7,
cex.main=0.9,
cex.axis=0.7,
xlim=c(0, max(spl[[i]]$x)+10),
col=as.character(spl[[i]][1,7]), #haeataan väri
suoraan datasta
plot.grid = TRUE,
)
box()
mtext(paste(paste(as.character(spl[[i]][1,2]), ":", sep=""),
"menekki osastoittain", "(10 suurinta)", as.character(spl[[i]][1,3])),
outer=T, line = 0.5, cex=1.1)
mtext("kpl", side=1, line=1.5, adj=0.5)
dev.copy(png, filename=paste(i, ".png", sep=""), height=400,
width=480)
dev.off()
par(opar)
}
Cheers,
Lauri
2007/8/30, Marc Schwartz <marc_schwartz at comcast.net>:
> On Thu, 2007-08-30 at 20:13 +0300, Lauri Nikkinen wrote:
> > Hi R-users,
> >
> > I inted to make multiple plots using for loop. The question is how can
> > I adjust the left hand side margin of the plot according to the
> > names.arg argument in barplot2. In every plot I have different
> > annotations in the y axis and they vary in length. Now when I have
> > fixed margins
> >
> > opar <- par(mar=c(3,15,0,2)...
> >
> > I get the same margins in all of the plots. That leaves lots of white
> > space in plots where the annotations are short.
> >
> > Here is the code I'm using:
> >
> > library(gplots)
> > opar <- par(mar=c(3,15,0,2), bg="white", cex=1, oma = c(0, 0, 2, 0),
> > mgp=c(3,0.5,0))
> > for (i in names(spl)) {
> > .order <- order(spl[[i]]$x)
> > barplot2(spl[[i]]$x[.order],
> > names.arg=as.character(spl[[i]]$os[.order]),
> > horiz=TRUE,
> > las=1,
> > cex.names=0.7,
> > cex.main=0.9,
> > cex.axis=0.7,
> > xlim=c(0, max(spl[[i]]$x)+10),
> > col=as.character(spl[[i]][1,7]),
> > plot.grid = TRUE,
> > )
> > box()
> > mtext(paste(paste(as.character(spl[[i]][1,2]), ":", sep=""),
> > "texthere", "(texthere)", as.character(spl[[i]][1,3])), outer=T, line
> > = 0.5, cex=1.1)
> > mtext("texthere", side=1, line=1.5, adj=0.5)
> > dev.copy(png, filename=paste(i, ".png", sep=""), height=400,
> > width=480)
> > dev.off()
> > }
> >
> > Thanks in advance
> > Lauri
>
> Lauri,
>
> Without your actual data or a sample, it is difficult to give you a
> specific solution.
>
> However, a general approach would be to ascertain the longest label that
> you would be using for each plot and then adjust par("mar") accordingly
> WITHIN the loop before calling barplot2().
>
> You can use the following to get the longest value in a vector:
>
> Vec <- c("Male", "Female")
>
> > Vec[which.max(nchar(Vec))]
> [1] "Female"
>
>
> Presumably in your case, you would replace 'Vec' with
> 'as.character(spl[[i]]$os[.order])'
>
> Once you know which value is the longest, you could also use strwidth()
> to get a sense for the amount of space the label would take and further
> fine tune par("mar"). This step may be optional depending your specific
> needs.
>
> See ?nchar, ?which.max and ?strwidth for more information.
>
> HTH,
>
> Marc Schwartz
>
>
>
More information about the R-help
mailing list