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 <[EMAIL PROTECTED]>: > 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 > > > ______________________________________________ R-help@stat.math.ethz.ch 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.