I am trying to create a stacked bar plot, but I cannot position the legend so that it does not overlap any of the bars. I have tried adjusting the margins, setting xlim
, using a separate legend
statement and searching here, all without success. Indeed, the code for the example data set came from StackOverflow. I am using base R and prefer a base R solution. Thank you for any advice.
setwd('c:/users/mmiller21/simple R programs/') jpeg(filename = "barplot.jpeg") set.seed(1234) x <- replicate(8, round(10 * rexp(2000, 10))) y <- apply(x, 2, function(column) table(factor(column, levels = 0:9))) colnames(y) <- paste('A', seq(1,ncol(y),1), sep='') rownames(y) <- paste('R', seq(1,nrow(y),1), sep='') y # A1 A2 A3 A4 A5 A6 A7 A8 # R1 769 800 790 806 792 787 834 801 # R2 779 733 793 757 786 744 731 776 # R3 284 297 278 272 263 301 280 275 # R4 112 106 91 124 106 103 104 96 # R5 33 38 37 26 36 37 30 36 # R6 11 18 7 11 10 20 11 9 # R7 8 8 3 2 3 3 9 5 # R8 4 0 1 2 4 4 0 2 # R9 0 0 0 0 0 1 1 0 # R10 0 0 0 0 0 0 0 0 par(mfrow=c(1, 1), mar=c(5, 5, 4, 2) + 0.1) barplot(y, col = 1:nrow(y), ylab="My Variables", legend.text = TRUE, args.legend = list(x = "topright", bty = "n")) dev.off()
You can place the legend literally anywhere. To put it around the chart, use the legend. position option and specify top , right , bottom , or left . To put it inside the plot area, specify a vector of length 2, both values going between 0 and 1 and giving the x and y coordinates.
A legend is a tool to help explain a graph. You are most commonly going to want to add one to a bar chart where you have several data series. You'll also want to add one to a line or scatter plot when you have more than one series. Essentially you use a legend to help make a complicated plot more understandable.
The legend tells us what each bar represents. Just like on a map, the legend helps the reader understand what they are looking at. Legend examples can be found in the second and third graphs above.
How about this:
library(RColorBrewer) barplot( y, xlim=c(0, ncol(y) + 3), col=brewer.pal(nrow(y), "Paired"), ylab="My Variables", legend.text=TRUE, args.legend=list( x=ncol(y) + 3, y=max(colSums(y)), bty = "n" ) )
With margins
par(mfrow=c(1, 1), mar=c(5, 5, 4, 8)) barplot(y, col = 1:nrow(y), ylab="My Variables", legend.text = TRUE, args.legend = list(x = "topright", bty = "n", inset=c(-0.15, 0)))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With