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"))

Створено 2019-12-07 пакетом reprex (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")

Створено 2019-02-28 пакетом reprex (v0.2.1)


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

Зараз я вдосконалив свою відповідь, щоб запропонувати два недосконалі рішення
Артур Іп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.