图例放置,ggplot,相对于绘图区域

这里的问题有点显而易见。 我想把这个图例置于(locking)在“绘图区域”的左上angular。 由于许多原因,使用c(0.1,0.13)等不是一种select。

有没有办法改变坐标的参考点,以便它们相对于绘图区域?

mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), title="Legend placement makes me sad") 

在这里输入图像说明

干杯

指南的位置默认情况下是基于绘图区域(即灰色填充的区域),但是alignment是居中的。 所以你需要设置左上alignment:

 ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), legend.justification = c(0, 1), legend.background = theme_rect(colour = NA, fill = "white"), title="Legend placement makes me happy") 

在这里输入图像说明

如果要将指南放在整个设备区域,可以调整gtable输出:

 p <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.position = c(0, 1), legend.justification = c(0, 1), legend.background = theme_rect(colour = "black"), title="Legend placement makes me happy") gt <- ggplot_gtable(ggplot_build(p)) nr <- max(gt$layout$b) nc <- max(gt$layout$r) gb <- which(gt$layout$name == "guide-box") gt$layout[gb, 1:4] <- c(1, 1, nr, nc) grid.newpage() grid.draw(gt) 

在这里输入图像说明

只是为了扩大柯克斯的答案,所以对于下一个人来说,它会更全面一些。

 mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) library(gridExtra) a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(0, 1), legend.position = c(0, 1), title="Legend is top left") b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(1, 0), legend.position = c(1, 0), title="Legend is bottom right") c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(0, 0), legend.position = c(0, 0), title="Legend is bottom left") d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + opts(legend.justification = c(1, 1), legend.position = c(1, 1), title="Legend is top right") grid.arrange(a,b,c,d) 

在这里输入图像说明

我一直在寻找类似的答案。 但是发现opts函数不再是ggplot2包的一部分。 在search了更多的时间后,我发现可以使用theme来做类似的事情。 因此编辑这个线程,以尽量减less其他时间。

以下是由nzcoops编写的类似代码。

 mtcars$cyl <- factor(mtcars$cyl, labels=c("four","six","eight")) library(gridExtra) a <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top left") + theme(legend.justification = c(0, 1), legend.position = c(0, 1)) b <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom right") + theme(legend.justification = c(1, 0), legend.position = c(1, 0)) c <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is bottom left") + theme(legend.justification = c(0, 0), legend.position = c(0, 0)) d <- ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point(aes(colour=cyl)) + labs(title = "Legend is top right") + theme(legend.justification = c(1, 1), legend.position = c(1, 1)) grid.arrange(a,b,c,d) 

这段代码将给出完全相似的情节。

为了扩展上面的答案和答案,如果你想在图例和图框外添加填充,可以使用legend.box.margin

 # Positions legend at the bottom right, with 50 padding # between the legend and the outside of the graph. theme(legend.justification = c(1, 0), legend.position = c(1, 0), legend.box.margin=margin(c(50,50,50,50))) 

这可以在ggplot2本文时使用最新版本的ggplot2 ,它是ggplot2