[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