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)

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