Tom Arnold
2002-Nov-12 17:40 UTC
[R] trouble positioning legends on barplot written to a file
I'm trying to generate some plots for print publication and I'm having trouble getting them the way I want. I get a plot with a legend that overlaps the bars and looks bad. Also, I'm saving this as PDF file (whatever happened to the "png" function to save as PNG format, in r 1.4.1?) I've tried a number of things, which produce a number of questions. 1) it seems that the "legend" for a plot must be within the plot area. Is there a way to put the legend above, below, or to the side of the plot? The particular data I have fill up the plotting area (stacked bar charts, going to 100% in each bar) 2) I've tried using "locator()" to position the legend. This only works, so far, if I am not using trying to divert output to another device -- like creating a PDF via pdf(); barplot(resultmat); dev.off(); so if I take out the pdf() and the dev.off() and just do this: barplot(resultmat); legend(locator(1),legend=l,fill=colors); it works, on the graphics display device window on screen. However, if I do this: pdf(onefile=FALSE); barplot(resultmat); legend(locator(1),legend=l,fill=colors); dev.off(); I get:>Error in legend(locator(1),legend = l : missing yAlso it doesn't let me specify a point. I suppose that's not so surprising, because it is drawing to a non-interactive graphics device (the PDF "device" is non-interactive, right?), but the error message is confusing. So, is there any way to specify the location with locator() AND to save that plot to a file? And if I don't use "locator' then I have to specify the legend location to "legend(x,y, legend) but the documentation doesn't say what coordinate system that's supposed to be in. TIA. Tom Arnold -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Paul Murrell
2002-Nov-12 20:19 UTC
[R] trouble positioning legends on barplot written to a file
Hi It is possible to draw the legend outside the plot, but it is inconvenient because the location is specified in terms of the scales on the x- and y-axes. Positioning therefore becomes a matter of trial and error. In the example below, I create space for the legend using par(oma) [again the size of the margin is a matter of guess work] and make sure that the legend is not clipped out of existence by specifying par(xpd=NA) ... # generate some dummy data that sums to 100 in each col data(VADeaths) temp <- function(x) { sample(seq(10, 30, 5)) } dummy <- apply(VADeaths, 2, temp) # Plotting ... par(oma=c(0, 0, 5, 0), xpd=NA) colours <- 1:5 barplot(dummy, col=colours) legend(par("usr")[1], 110, row.names(VADeaths), fill=colours, yjust=0, horiz=TRUE) You might have other colours you would prefer to use :) Hope that helps. Paul Tom Arnold wrote:> > I'm trying to generate some plots for print publication and I'm having trouble > getting them the way I want. I get a plot with a legend that overlaps the bars > and looks bad. Also, I'm saving this as PDF file (whatever happened to the > "png" function to save as PNG format, in r 1.4.1?) > > I've tried a number of things, which produce a number of questions. > > 1) it seems that the "legend" for a plot must be within the plot area. Is > there a way to put the legend above, below, or to the side of the plot? The > particular data I have fill up the plotting area (stacked bar charts, going to > 100% in each bar) > > 2) I've tried using "locator()" to position the legend. This only works, so > far, if I am not using trying to divert output to another device -- like > creating a PDF via > pdf(); > barplot(resultmat); > dev.off(); > > so if I take out the pdf() and the dev.off() and just do this: > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > > it works, on the graphics display device window on screen. > > However, if I do this: > pdf(onefile=FALSE); > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > dev.off(); > > I get: > >Error in legend(locator(1),legend = l : missing y > > Also it doesn't let me specify a point. I suppose that's not so surprising, > because it is drawing to a non-interactive graphics device (the PDF "device" > is non-interactive, right?), but the error message is confusing. > > So, is there any way to specify the location with locator() AND to save that > plot to a file? > > And if I don't use "locator' then I have to specify the legend location to > "legend(x,y, legend) but the documentation doesn't say what coordinate system > that's supposed to be in. > > TIA. > > Tom Arnold > > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- > r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html > Send "info", "help", or "[un]subscribe" > (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._-- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x5392 paul at stat.auckland.ac.nz -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
ripley@stats.ox.ac.uk
2002-Nov-12 21:29 UTC
[R] trouble positioning legends on barplot written to a file
On Tue, 12 Nov 2002, Tom Arnold wrote:> I'm trying to generate some plots for print publication and I'm having trouble > getting them the way I want. I get a plot with a legend that overlaps the bars > and looks bad. Also, I'm saving this as PDF file (whatever happened to the > "png" function to save as PNG format, in r 1.4.1?)Nothing: it is still there on the systems that have ever had it, Windows and Unix-alikes with an X11 display. What's your problem in finding it? What does ?png give on your system?> I've tried a number of things, which produce a number of questions. > > 1) it seems that the "legend" for a plot must be within the plot area. Is > there a way to put the legend above, below, or to the side of the plot? The > particular data I have fill up the plotting area (stacked bar charts, going to > 100% in each bar)Look up the xpd par argument to plot outside the plot region (but still in the figure region).> 2) I've tried using "locator()" to position the legend. This only works, so > far, if I am not using trying to divert output to another device -- like > creating a PDF via > pdf(); > barplot(resultmat); > dev.off(); > > so if I take out the pdf() and the dev.off() and just do this: > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > > it works, on the graphics display device window on screen. > > However, if I do this: > pdf(onefile=FALSE); > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > dev.off(); > > I get: > >Error in legend(locator(1),legend = l : missing y > > Also it doesn't let me specify a point. I suppose that's not so surprising, > because it is drawing to a non-interactive graphics device (the PDF "device" > is non-interactive, right?), but the error message is confusing.It's you who confused it. Print the result of locator(1) and look up ?legend and you will see why you get the message. If you call a function with incorrect arguments, why don't you expect an error message telling you so?> So, is there any way to specify the location with locator() AND to save that > plot to a file?Yes, via dev.copy and friends.> And if I don't use "locator' then I have to specify the legend location to > "legend(x,y, legend) but the documentation doesn't say what coordinate system > that's supposed to be in.There is only one coordinate system, that set by the plot() command. *None* of the R graphics commands tell you the coordinate system to be used precisely because there is only one at a time. There *is* are example on the help page for legend. -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Uwe Ligges
2002-Nov-12 22:55 UTC
[R] trouble positioning legends on barplot written to a file
Tom Arnold wrote:> > I'm trying to generate some plots for print publication and I'm having trouble > getting them the way I want. I get a plot with a legend that overlaps the bars > and looks bad. Also, I'm saving this as PDF file (whatever happened to the > "png" function to save as PNG format, in r 1.4.1?)??? pdf() produces PDFs, png() portable network graphics, etc. .... I don't get the point. BTW: R-1.4.1 is rather old.> I've tried a number of things, which produce a number of questions. > > 1) it seems that the "legend" for a plot must be within the plot area. Is > there a way to put the legend above, below, or to the side of the plot? The > particular data I have fill up the plotting area (stacked bar charts, going to > 100% in each bar)Use par(xpd = TRUE) before legend(), see ?par for details.> 2) I've tried using "locator()" to position the legend. This only works, so > far, if I am not using trying to divert output to another device -- like > creating a PDF via > pdf(); > barplot(resultmat); > dev.off(); > > so if I take out the pdf() and the dev.off() and just do this: > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > > it works, on the graphics display device window on screen. > > However, if I do this: > pdf(onefile=FALSE); > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > dev.off(); > > I get: > >Error in legend(locator(1),legend = l : missing y > > Also it doesn't let me specify a point. I suppose that's not so surprising, > because it is drawing to a non-interactive graphics device (the PDF "device" > is non-interactive, right?), but the error message is confusing.I wouldn't expect locator() to work that way at all ...> So, is there any way to specify the location with locator() AND to save that > plot to a file?Yes. plot() to the windows() or x11() device, use locator() and "copy" the plot to another device. Look particularly at ?dev.copy, ?dev.print, and ?dev.copy2eps(...) I don't recommend this way.> And if I don't use "locator' then I have to specify the legend location to > "legend(x,y, legend) but the documentation doesn't say what coordinate system > that's supposed to be in.Use par("usr") (after barplot()) to get some interesting information. Thgis can be combined with par(xpd = TRUE), which was mentioned above: pdf(onefile = FALSE) barplot(resultmat) # get "extremes of the user coordinates of the plotting region." par("usr") # "plotting clipped to figure region" par(xpd = TRUE) # now a proper legend() dev.off() Uwe Ligges> TIA. > > Tom Arnold-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Warnes, Gregory R
2002-Nov-12 23:19 UTC
[R] trouble positioning legends on barplot written to a file
You might consider putting the legend in a separate plot area. For instance, using the layout function: library(grid) data(VADeaths, package = "base") layout( cbind(1,2), widths=c(8,3) ) # make two plotting areas, # 8 and 3 units wide barplot(VADeaths, plot = TRUE) # generate the barplot plot.new() # move to the new region legend(x=0.5,y=0.5,letters[1:5], # center a legend in the new fill=heat.colors(5)[1:5], # plot region xjust=0.5,yjust=0.5) -Greg> -----Original Message----- > From: Tom Arnold [mailto:tarnold at smpllc.com] > Sent: Tuesday, November 12, 2002 12:40 PM > To: r-help at stat.math.ethz.ch > Subject: [R] trouble positioning legends on barplot written to a file > > > I'm trying to generate some plots for print publication and > I'm having trouble > getting them the way I want. I get a plot with a legend that > overlaps the bars > and looks bad. Also, I'm saving this as PDF file (whatever > happened to the > "png" function to save as PNG format, in r 1.4.1?) > > I've tried a number of things, which produce a number of questions. > > 1) it seems that the "legend" for a plot must be within the > plot area. Is > there a way to put the legend above, below, or to the side of > the plot? The > particular data I have fill up the plotting area (stacked bar > charts, going to > 100% in each bar) > > 2) I've tried using "locator()" to position the legend. This > only works, so > far, if I am not using trying to divert output to another > device -- like > creating a PDF via > pdf(); > barplot(resultmat); > dev.off(); > > so if I take out the pdf() and the dev.off() and just do this: > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > > it works, on the graphics display device window on screen. > > However, if I do this: > pdf(onefile=FALSE); > barplot(resultmat); > legend(locator(1),legend=l,fill=colors); > dev.off(); > > I get: > >Error in legend(locator(1),legend = l : missing y > > Also it doesn't let me specify a point. I suppose that's not > so surprising, > because it is drawing to a non-interactive graphics device > (the PDF "device" > is non-interactive, right?), but the error message is confusing. > > So, is there any way to specify the location with locator() > AND to save that > plot to a file? > > And if I don't use "locator' then I have to specify the > legend location to > "legend(x,y, legend) but the documentation doesn't say what > coordinate system > that's supposed to be in. > > TIA. > > Tom Arnold > > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. > -.-.-.-.-.-.-.-.- > r-help mailing list -- Read > http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html > Send "info", "help", or "[un]subscribe" > (in the "body", not the subject !) To: > r-help-request at stat.math.ethz.ch > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._. > _._._._._._._._._ >LEGAL NOTICE Unless expressly stated otherwise, this message is confidential and may be privileged. It is intended for the addressee(s) only. Access to this E-mail by anyone else is unauthorized. If you are not an addressee, any disclosure or copying of the contents of this E-mail or any action taken (or not taken) in reliance on it is unauthorized and may be unlawful. If you are not an addressee, please inform the sender immediately. -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._