ggplot2 легенда снизу и по горизонтали


109

Как переместить легенду ggplot2 в нижнюю часть графика и повернуть ее по горизонтали?

Образец кода:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend())

Желаемый (приблизительный) результат: введите описание изображения здесь


2
Спустя 7 лет и 8 месяцев я наконец понял, как получить желаемый результат для этого вопроса :) Прокрутите вниз до второго ответа.
Артур Йип

Ответы:


146

Если вы хотите переместить легенду, используйте следующий код:

library(reshape2) # for melt
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
    theme(legend.position="bottom")

Это должно дать вам желаемый результат. Легенда внизу


2
знаете ли вы, можно ли нарисовать непрерывную полосу легенды внизу? (так что не с числом между ними, а сверху). Спасибо.
Janvb

3
С током ggplotэто дает мне предупреждение 'opts' is deprecated. Use 'theme' instead. (Deprecated; last used in version 0.9.1). Замена optsпо themeработам.
krlmlr

Да, я ggplot
ожидаю

10
Использование обесцененных предметов - плохая практика. Вы можете сделать это с помощью темы точно так же:+ theme(legend.position='bottom')
до0

к сожалению, когда числа и цвета расположены рядом, возникает некоторая двусмысленность; см. мой ответ ниже на несколько попыток улучшить это.
Артур Йип

37

Вот как добиться желаемого результата:

library(reshape2); library(tidyverse)
melt(outer(1:4, 1:4), varnames = c("X1", "X2")) %>%
ggplot() + 
  geom_tile(aes(X1, X2, fill = value)) + 
  scale_fill_continuous(guide = guide_legend()) +
  theme(legend.position="bottom",
        legend.spacing.x = unit(0, 'cm'))+
  guides(fill = guide_legend(label.position = "bottom"))

Создано 07.12.2019 пакетом REPEX (v0.3.0)


Изменить: больше нет необходимости в этих несовершенных параметрах, но я оставляю их здесь для справки.

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

library(reshape2); library(tidyverse)
df <- melt(outer(1:4, 1:4), varnames = c("X1", "X2"))
p1 <- ggplot(df, aes(X1, X2)) + geom_tile(aes(fill = value))
p1 + scale_fill_continuous(guide = guide_legend()) +
 theme(legend.position="bottom", legend.direction="vertical")

p1 + scale_fill_continuous(guide = "colorbar") + theme(legend.position="bottom")

Создано 28.02.2019 пакетом REPEX (v0.2.1)


Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Рохит Гупта,

Теперь я улучшил свой ответ, чтобы предложить два несовершенных решения
Артур Йип
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.