Thanks for you attention Mark. Your approach is really very interesting. I will try to apply it in my code.
All the best Antonio 2017-05-11 16:19 GMT-03:00 Marc Schwartz <marc_schwa...@me.com>: > > > On May 11, 2017, at 1:36 PM, Antonio Silva <aolinto....@gmail.com> > wrote: > > > > Hello r-users > > > > I want to plot some barplots inside a looping with the legend placed > > outside the plotting area. > > > > No matter the number of bars I want the legend to be placed centered on > the > > x-axis. > > > > See the example below > > > > for(i in 1:10) { > > var_1 <- sample(1000:100000,sample(3:8,1)) > > ymax <- max(var_1) > > b<-barplot(var_1,col="blue") > > var_2 <- sample(1000:ymax,length(var_1)) > > lines(rowSums(b),var_2,type="o",col="red",pch=16) > > par(xpd=TRUE) > > legend(*1.1* > > ,ymax*-0.072,c("var_1","var_2"),horiz=T,cex=1.3,bty="n",pch= > c(15,16),col=c("blue","red"),lty=c(0,1),lwd=c(0,2),pt.cex=2) > > readline(prompt="Press [enter] to continue") > > } > > > > What I should use as x position in legend(x,y, ...), instead of *1.1*, to > > have the legend centered on the x-axis? > > > > I would love to use something like legend(x="center",y=ymax*-0.072, ... > but > > it did not worked.co > > > > I appreciate any suggestions. Best regards. > > > > Antonio > > > Hi, > > There is a level of magic that goes into the legend() code to determine > the placement of the legend. You can take the time to review the code for > the function, noting how, internally, the location of the box that contains > the legend is determined. > > Somebody may have an easier way to do this, but one approach is to first > call legend() but set 'plot = FALSE' and obtain the return values of the > function for use in a second call that will draw the legend in the position > you desire. > > > Here is some basic information: > > # Draw the initial barplot > barplot(1:5) > > # Call legend() the first time, but don't draw it > # See ?legend for the Value section > # Use "bottom" to get the legend drawn in the center of the x axis, but it > # will be within the plot region by default. > # Just save the 'rect' component of the returned value > BOX <- legend("bottom", legend = c("Label 1", "Label 2"), plot = > FALSE)$rect > > # This gives us the width and height of the box containing the legend > # as well as the x,y coordinates of the upper left hand corner > > BOX > $w > [1] 1.002451 > > $h > [1] 0.5872093 > > $left > [1] 2.598775 > > $top > [1] 0.5372093 > > > Now, using BOX$left, which defines the x axis value for the left side of > the legend box that is centered, we can call legend() a second time and > adjust the y axis value of the legend to place it outside the plot region, > below the plot. Just be sure that your second call to legend() is exactly > the same as the first call, other than setting legend to FALSE in the first > case. Any change in legend content between the two calls will alter the > size and position of the enclosing box. > > par(xpd = TRUE) > legend(BOX$left, y = -0.25, legend = c("Label 1", "Label 2")) > > > You can then adapt that basic approach to use in your code. > > As an FYI, see ?par and note "usr", which defines the coordinates of the > plot region. If desired, you can get the midpoint of the x axis using: > > mean(par("usr")[1:2]) > > Regards, > > Marc Schwartz [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.