Karsten Loesing
2010-Jun-07 13:39 UTC
[R] Patch for legend.position={left,top,bottom} in ggplot2
Hi Hadley and everyone, here's a patch for ggplot2 that fixes the behavior of opts(legend.position={left,top,bottom}). If you try the following code in an unmodified ggplot2 options(warn = -1) suppressPackageStartupMessages(library("ggplot2")) data <- data.frame( x = c(1, 2, 3, 4, 5, 6), y = c(2, 3, 4, 3, 4, 5), colour = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)) ggplot(data, aes(x = x, y = y, colour = colour)) + geom_line() + opts(title = "title", legend.position = "right") ggplot(data, aes(x = x, y = y, colour = colour)) + geom_line() + opts(title = "title", legend.position = "left") ggplot(data, aes(x = x, y = y, colour = colour)) + geom_line() + opts(title = "title", legend.position = "top") ggplot(data, aes(x = x, y = y, colour = colour)) + geom_line() + opts(title = "title", legend.position = "bottom") you'll see that plots 2 to 4 are broken. I think I located the bug in surround_viewports() where the graphical elements are placed into the grid. If we increment all rows and columns of the graphical elements for positions "left", "top", and "bottom" by 1, those graphs look sane again. I assume that a new first row and column were added at some point in the development, but only the parameters for the default position "right" were adjusted. Here's the patch: --- ggplot2-orig2 2010-06-07 13:14:35.000000000 +0200 +++ ggplot2 2010-06-07 15:22:33.000000000 +0200 @@ -7003,27 +7003,27 @@ ) } else if (position == "left") { viewports <- vpList( - vp("panels", 2, 3), - vp("legend_box", 2, 1), - vp("ylabel", 2, 2), - vp("xlabel", 3, 3), - vp("title", 1, 3) + vp("panels", 3, 4), + vp("legend_box", 3, 2), + vp("ylabel", 3, 3), + vp("xlabel", 4, 4), + vp("title", 2, 4) ) } else if (position == "top") { viewports <- vpList( - vp("panels", 3, 2), - vp("legend_box", 2, 2), - vp("ylabel", 3, 1), - vp("xlabel", 4, 2), - vp("title", 1, 2) + vp("panels", 4, 3), + vp("legend_box", 3, 3), + vp("ylabel", 4, 2), + vp("xlabel", 5, 3), + vp("title", 2, 3) ) } else if (position == "bottom") { viewports <- vpList( - vp("panels", 2, 2), - vp("legend_box", 4, 2), - vp("ylabel", 2, 1), - vp("xlabel", 3, 2), - vp("title", 1, 2) + vp("panels", 3, 3), + vp("legend_box", 5, 3), + vp("ylabel", 3, 2), + vp("xlabel", 4, 3), + vp("title", 2, 3) ) } else { viewports <- vpList( Best, --Karsten
Karsten Loesing
2010-Jun-10 07:49 UTC
[R] Patch for legend.position={left,top,bottom} in ggplot2
Hi everyone, here's the same patch as a new branch on GitHub. http://github.com/kloesing/ggplot2/commit/a25e4fbfa4017ed1 Best, --Karsten On 6/7/10 3:39 PM, Karsten Loesing wrote:> Hi Hadley and everyone, > > here's a patch for ggplot2 that fixes the behavior of > opts(legend.position={left,top,bottom}). If you try the following code > in an unmodified ggplot2 > > options(warn = -1) > suppressPackageStartupMessages(library("ggplot2")) > data <- data.frame( > x = c(1, 2, 3, 4, 5, 6), > y = c(2, 3, 4, 3, 4, 5), > colour = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE)) > ggplot(data, aes(x = x, y = y, colour = colour)) + > geom_line() + opts(title = "title", legend.position = "right") > ggplot(data, aes(x = x, y = y, colour = colour)) + > geom_line() + opts(title = "title", legend.position = "left") > ggplot(data, aes(x = x, y = y, colour = colour)) + > geom_line() + opts(title = "title", legend.position = "top") > ggplot(data, aes(x = x, y = y, colour = colour)) + > geom_line() + opts(title = "title", legend.position = "bottom") > > you'll see that plots 2 to 4 are broken. > > I think I located the bug in surround_viewports() where the graphical > elements are placed into the grid. If we increment all rows and columns > of the graphical elements for positions "left", "top", and "bottom" by > 1, those graphs look sane again. I assume that a new first row and > column were added at some point in the development, but only the > parameters for the default position "right" were adjusted. Here's the patch: > > > --- ggplot2-orig2 2010-06-07 13:14:35.000000000 +0200 > +++ ggplot2 2010-06-07 15:22:33.000000000 +0200 > @@ -7003,27 +7003,27 @@ > ) > } else if (position == "left") { > viewports <- vpList( > - vp("panels", 2, 3), > - vp("legend_box", 2, 1), > - vp("ylabel", 2, 2), > - vp("xlabel", 3, 3), > - vp("title", 1, 3) > + vp("panels", 3, 4), > + vp("legend_box", 3, 2), > + vp("ylabel", 3, 3), > + vp("xlabel", 4, 4), > + vp("title", 2, 4) > ) > } else if (position == "top") { > viewports <- vpList( > - vp("panels", 3, 2), > - vp("legend_box", 2, 2), > - vp("ylabel", 3, 1), > - vp("xlabel", 4, 2), > - vp("title", 1, 2) > + vp("panels", 4, 3), > + vp("legend_box", 3, 3), > + vp("ylabel", 4, 2), > + vp("xlabel", 5, 3), > + vp("title", 2, 3) > ) > } else if (position == "bottom") { > viewports <- vpList( > - vp("panels", 2, 2), > - vp("legend_box", 4, 2), > - vp("ylabel", 2, 1), > - vp("xlabel", 3, 2), > - vp("title", 1, 2) > + vp("panels", 3, 3), > + vp("legend_box", 5, 3), > + vp("ylabel", 3, 2), > + vp("xlabel", 4, 3), > + vp("title", 2, 3) > ) > } else { > viewports <- vpList( > > > Best, > --Karsten >