Как переместить или разместить легенду в ggplot2

Я пытаюсь создать сюжет ggplot2 с легендой под сюжетом.

В книге ggplot2 на стр. 112 говорится: «Положение и выравнивание легенд контролируются настройкой темы legend.position, и значение может быть справа, слева, вверху, внизу, нет (без легенды) или числовым положением».

Следующий код работает (так как "right" это значение по умолчанию), и он также работает с "none" в качестве позиции легенды, но "left", "top", "bottom", все терпят неудачу с "Error in grid.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")

Что я делаю неправильно? Изменение положения легенды должно быть невероятно распространенным явлением, поэтому я полагаю, что это я.


person Dan Goldstein    schedule 01.06.2010    source источник


Ответы (4)


В версиях> 0.9.3 (когда opts устарел)

theme(legend.position = "bottom")

Старая версия:

К сожалению, это ошибка в ggplot2, которую я очень надеюсь исправить этим летом.

Обновление:

Ошибка, связанная с opts(legend.position = "left"), была исправлена ​​с использованием последней версии ggplot2. Кроме того, в версии 0.9.0 были введены guide_legend и guide_colorbar, которые позволяют более точно контролировать внешний вид и расположение элементов в самой легенде. Например, возможность указать количество строк и столбцов для элементов легенды.

person hadley    schedule 02.06.2010
comment
Разве это не сделано сейчас с theme_update(legend.position = "bottom")? - person Rui Vieira; 27.07.2016
comment
@RuiVieira для theme_update(), см. ggplot2.tidyverse.org/reference/theme.html Изменить тема отдельного сюжета с использованием theme (); см. theme_update (), если вы хотите изменить активную тему, чтобы повлиять на все последующие сюжеты. - person joelostblom; 26.10.2020

Всего несколько обновлений к этим ответам, пока я здесь. Как упоминал Хэдли, вы можете переместить легенду вниз с помощью theme(legend.position = "bottom")

Или переместите его вручную theme(legend.position = c(.2,.85))

Если вы хотите, чтобы легенда была горизонтальной, используйте theme(legend.position = c(.2,.85), legend.direction = "horizontal")

person Derelict    schedule 17.08.2018

Вы всегда можете разместить легенду вручную, но поскольку метка все еще расположена вертикально, это выглядит некрасиво. Я очень надеюсь, что Хэдли найдет время исправить это :-)

p <- qplot(VarX,VarY, data=myDat, shape=Descrip) + 
opts(legend.position=c(.5,0.9),plot.margin = unit(c(6,0,0,0), "lines"))
person Andreas    schedule 03.06.2010
comment
opts() устарел - используйте вместо него guide_legend(). docs.ggplot2.org/0.9.2.1/guide_legend.html - person Andrew; 27.11.2012
comment
Вы можете вызвать legend.direction = "horizontal" в theme аргументе. - person Derelict; 17.08.2018

В более новых версиях ggplot2 вы можете использовать + theme(legend.position='bottom').

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

введите здесь описание изображения

См. Поваренную книгу для R - Legends, чтобы узнать больше о доброте легенд.

В ответ на комментарий theme_update() не срабатывает, если вызывается в середине ggplot (как в + theme_update(), только в последующие разы. Он также изменяет активную тему, а не только конкретный сюжет. Таким образом, вы можете сделать это:

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

с результатами, как указано выше, с той разницей, что на последующих графиках также по умолчанию будут отображаться легенды внизу.

person C8H10N4O2    schedule 22.08.2017
comment
с темой (legend.position = bottom) моя легенда отображается внизу слева, а в вашем примере она показана посередине (как я думал, это было на моих предыдущих графиках на протяжении многих лет). Вы знаете, изменилось ли что-то в этом, и как снова получить это в середине? - person Tingolfin; 26.01.2018