如何在 ggplot2 中移动或定位图例

How to move or position a legend in ggplot2

提问人:Dan Goldstein 提问时间:6/2/2010 最后编辑:Dan Goldstein 更新时间:11/12/2021 访问量:129867

问:

我正在尝试创建一个 ggplot2 图,图例位于图下方。

ggplot2 书在第 112 页说:“图例的位置和对齐由主题设置 legend.position 控制,值可以是右、左、上、下、无(无图例)或数字位置”。

以下代码有效(因为“right”是默认值),它也适用于“none”作为图例位置,但“left”、“top”、“bottom”都因“网格错误”而失败。Call.graphics(“L_setviewport”, pvp, TRUE) : 视口的非有限位置和/或大小”

library(ggplot2)
(myDat <- data.frame(cbind(VarX=10:1, VarY=runif(10)), 
    Descrip=sample(LETTERS[1:3], 10, replace=TRUE)))
qplot(VarX,VarY, data=myDat, shape=Descrip) + 
    opts(legend.position="right")

我做错了什么?重新定位一个传奇一定是非常普遍的,所以我想是我。

r ggplot2 例图 例-属性

评论


答:

121赞 hadley 6/2/2010 #1

在版本 > 0.9.3 中(不推荐使用时)opts

theme(legend.position = "bottom")

旧版本:

不幸的是,这是 ggplot2 中的一个错误,我真的非常希望在今年夏天修复它。

更新:

涉及的错误已使用最新版本的 ggplot2 修复。此外,版本 0.9.0 还引入了 and,它允许对图例本身中项目的外观和位置进行更精细的控制。例如,该功能可以指定图例项的行数和列数。opts(legend.position = "left")guide_legendguide_colorbar

评论

0赞 Rui Vieira 7/28/2016
现在不是用吗?theme_update(legend.position = "bottom")
1赞 joelostblom 10/26/2020
@RuiVieira,请参阅 ggplot2.tidyverse.org/reference/theme.html“使用 theme() 修改单个绘图的主题;如果要修改活动主题以影响所有后续绘图,请参阅 theme_update()。"theme_update()
5赞 Andreas 6/3/2010 #2

您可以随时手动放置图例 - 但由于标签仍然是堆叠/垂直的,因此看起来有点丑陋。我真的希望哈德利能抽出时间解决这个问题:-)

p <- qplot(VarX,VarY, data=myDat, shape=Descrip) + 
opts(legend.position=c(.5,0.9),plot.margin = unit(c(6,0,0,0), "lines"))

评论

9赞 Andrew 11/27/2012
opts()现已弃用 - 改用。docs.ggplot2.org/0.9.2.1/guide_legend.htmlguide_legend()
1赞 derelict 8/18/2018
您可以调用参数。legend.direction = "horizontal"theme
8赞 C8H10N4O2 8/22/2017 #3

在较新版本的 中,可以使用 。ggplot2+ theme(legend.position='bottom')

qplot(VarX,VarY, data=myDat, shape=Descrip) + 
  theme(legend.position='bottom')

enter image description here

请参阅 Cookbook for R - Legends 了解更多传奇。

作为对注释的响应,如果在 ggplot 中间调用,则不会启动(如 ,仅在后续时间。它还修改了活动主题,而不仅仅是特定的情节。因此,您可以这样做:theme_update()+ theme_update()

theme_update(legend.position='bottom')
qplot(VarX,VarY, data=myDat, shape=Descrip) 

结果如上,不同之处在于后续绘图也将默认为底部的图例。

评论

0赞 Tingolfin 1/26/2018
使用 theme(legend.position=“bottom”),我的图例出现在左下角,而在您的示例中,它显示在中间(正如我多年来在我以前的图中所认为的那样)。你知道这是否发生了变化以及如何让它再次进入中间吗?
23赞 derelict 8/18/2018 #4

正如 Hadley 所提到的,你可以用theme(legend.position = "bottom")

或使用手动定位theme(legend.position = c(.2,.85))

如果希望图例是水平的,请使用theme(legend.position = c(.2,.85), legend.direction = "horizontal")