Размещение легенды над основным заголовком - PullRequest
0 голосов
/ 12 октября 2018

Размещение легенды над основным заголовком в ggplot2 при использовании theme(legend.position = "top"), казалось, было результатом по умолчанию (и нежелательным) в предыдущих версиях ggplot: легенда ggplot вверху, но под заголовком?

В текущей версии ggplot2 легенда помещает себя между графиком и основным заголовком при установке theme(legend.position = "top").Небольшой пример:

d <- data.frame(x = 1:2, y = 1:2, z = c("a", "b")) 
ggplot(d, aes(x = x, y = y, fill = z)) + 
  geom_col() +
  ggtitle("My title") +
  theme(legend.position = "top") 

enter image description here

Как разместить легенду над основным заголовком?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

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

Послесоздавая сюжет p с легендой, cowplot::get_legend(p) затем создает объект ggplot, который является просто легендой.Переставьте их с помощью plot_grid, добавляя вызов theme, который удаляет легенду из p.Вы, вероятно, захотите настроить высоту и, возможно, скорректировать поля.

library(ggplot2)

p <- ggplot(d, aes(x = x, y = y, fill = z)) + 
  geom_col() +
  ggtitle("My title") +
  theme(legend.position = "bottom") 

legend <- cowplot::get_legend(p)

cowplot::plot_grid(
  legend,
  p + theme(legend.position = "none"),
  ncol = 1, rel_heights = c(0.1, 1)
)

Создано в 2018-10-12 пакетом представитель (v0.2.1)

0 голосов
/ 13 октября 2018

Или мы можем создать фальшивый фасет и поместить в него заголовок графика.После этого выполните некоторые настройки, чтобы удалить фасет полосы и уменьшить поле легенды

library(ggplot2)

d <- data.frame(x = 1:2, y = 1:2, z = c("a", "b")) 
d$Title <- "My title\n"

# default legend key text
p1 <- ggplot(d, aes(x = x, y = y, fill = z)) + 
  geom_col() +
  facet_grid(~ Title) +
  theme(strip.text.x = element_text(hjust = 0, vjust = 1,
                                    size = 14, face = 'bold'),
        strip.background = element_blank()) +
  theme(legend.margin = margin(5, 0, 0, 0),
        legend.box.margin = margin(0, 0, -10, 0)) +
  theme(legend.position = "top") +
  NULL

# legend key text at the bottom
p2 <- ggplot(d, aes(x = x, y = y, fill = z)) + 
  geom_col() +
  facet_grid(~ Title) +
  theme(strip.text.x = element_text(hjust = 0, vjust = 1,
                                    size = 14, face = 'bold'),
        strip.background = element_blank()) +
  theme(legend.margin = margin(5, 0, 0, 0),
        legend.box.margin = margin(0, 0, -10, 0)) +
  guides(fill = guide_legend(label.position = "bottom",
                             title.position = "left", title.vjust = 1)) +
  theme(legend.position = "top") +
  NULL


library(patchwork)
p1 | p2

Создано в 2018-10-12 пакетом представ. (v0.2.1.9000)

0 голосов
/ 12 октября 2018
library(ggplot2)

ggplot(mtcars, aes(wt, mpg, color=cyl)) +
  geom_point() +
  labs(title = "Hey") +
  theme(plot.margin = margin(t=4,1,1,1, "lines")) +
  theme(legend.direction = "horizontal") +
  theme(legend.position = c(0.5, 1.2))

enter image description here

Есть и другие способы, но это был самый простой способ, который пришёл в голову.

...