Skip to content

Legend placement in barplots

3 messages · Uwe Ligges, David Whiting, Martin Maechler

#
david.whiting at ncl.ac.uk wrote:
The solution is to play around with the magic of par():

 par("mar")	# borders, see ?par
  # [1] 5.1 4.1 4.1 2.1
  # Now increase size of the bottom-border:
 par(mar=c(10.1, 4.1, 4.1, 2.1))
  # And set cpd=TRUE, so all plotting is clipped to the figure 
  # (not the plot) region:
 par(xpd=TRUE)
  # Your barplot:
 bp <- barplot(1:3) 
  # Text for the legend:
 legend.text <- c("cats", "dogs", "cows")
  # And plot the legend below the existing plot:
 legend(1,-0.5, legend.text, fill=heat.colors(length(legend.text)))
  # Or much nicer, center the legend:
 legend(mean(range(b)), -0.5, legend.text, xjust = 0.5,
	fill=heat.colors(length(legend.text)))

Uwe Ligges
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
#
Hi,

I am trying to use R to create some reasonably automatic output for
routine monitoring. Some of these outputs are simple bar charts. I need to
create something similar to an excel bar chart (yuk!, I know...:) which
places the legend at the bottom of the chart.

barplot() place the legend over the chart and can potentially cover some
of the detail (especially if the bars are numerous and thin). legend()
allows me to position the legend but, as the example below shows, still
only within the chart area. How can I place the legend below or to the
right of a bar plot? Do I need to use plot.new() and build it up myself?

Example:
--------
barplot(1:3, legend.text = c("cats", "dogs", "cows"))
legend(1,0.5, c("cats", "dogs", "cows"))
legend(1,0.1, c("cats", "dogs", "cows"))

Thanks,

Dave.
#

        
Uwe> david.whiting at ncl.ac.uk wrote:
>> 
    >> Hi,
    >> 
    >> I am trying to use R to create some reasonably automatic output for
    >> routine monitoring. Some of these outputs are simple bar charts. I need to
    >> create something similar to an excel bar chart (yuk!, I know...:) which
    >> places the legend at the bottom of the chart.
    >> 
    >> barplot() place the legend over the chart and can potentially cover some
    >> of the detail (especially if the bars are numerous and thin). legend()
    >> allows me to position the legend but, as the example below shows, still
    >> only within the chart area. How can I place the legend below or to the
    >> right of a bar plot? Do I need to use plot.new() and build it up myself?
    >> 
    >> Example:
    >> --------
    >> barplot(1:3, legend.text = c("cats", "dogs", "cows"))
    >> legend(1,0.5, c("cats", "dogs", "cows"))
    >> legend(1,0.1, c("cats", "dogs", "cows"))

    Uwe> The solution is to play around with the magic of par():

    Uwe> par("mar")	# borders, see ?par
    Uwe>  # [1] 5.1 4.1 4.1 2.1
    Uwe>  # Now increase size of the bottom-border:
    Uwe> par(mar=c(10.1, 4.1, 4.1, 2.1))
    Uwe>  # And set xpd=TRUE, so all plotting is clipped to the figure 
    Uwe>  # (not the plot) region:
    Uwe> par(xpd=TRUE)
    Uwe>  # Your barplot:
    Uwe> bp <- barplot(1:3) 
    Uwe>  # Text for the legend:
    Uwe> legend.text <- c("cats", "dogs", "cows")
    Uwe>  # And plot the legend below the existing plot:
    Uwe> legend(1,-0.5, legend.text, fill=heat.colors(length(legend.text)))
    Uwe>  # Or much nicer, center the legend:
    Uwe> legend(mean(range(bp)), -0.5, legend.text, xjust = 0.5,
    Uwe>        fill=heat.colors(length(legend.text)))

  (I've corrected two typos)

Note that it becomes quite a bit nicer to use the (relatively new)
argument `` horiz = TRUE '' with legend() -- you also need much
less margin space : 


## Example again :

 ## increase size of the bottom-border:
 par(mar= c(6, 4, 4, 2) + .1)
 ## Set xpd=TRUE, so all plotting is clipped to the figure 
 ## (not the plot) region:
 par(xpd=TRUE)
 ## Your barplot:
 bp <- barplot(1:3) 
 ## Text for the legend:
 legend.text <- c("cats", "dogs", "cows")
 ## And plot the legend below the existing plot -- centering it
 legend(mean(range(bp)), -0.3, legend.text, xjust = 0.5,
	fill=heat.colors(length(legend.text)), horiz = TRUE)


Martin Maechler <maechler at stat.math.ethz.ch>	http://stat.ethz.ch/~maechler/
Seminar fuer Statistik, ETH-Zentrum  LEO C16	Leonhardstr. 27
ETH (Federal Inst. Technology)	8092 Zurich	SWITZERLAND
phone: x-41-1-632-3408		fax: ...-1228			<><
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._