ggplot2: как разделить geom_polygon и geom_line в ключах легенды? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу:

  • удалить строку внутри ключа легенды geom_polygon и
  • удалить границу вокруг ключа легенды geom_line.

Желаемый результат будет

enter image description here

Моя неудачная попытка до сих пор.Заранее благодарю за любую помощь!

library(ggplot2)

set.seed(1337)

dat <- structure(list(id = structure(c(2L, 2L, 2L, 2L), 
                                    .Label = c("1.1", "1.2", "1.3", "2.1", "2.2", "2.3"), 
                                    class = "factor"), 
                     value = c(3.1, 3.1, 3.1, 3.1),
                     x = c(2.2, 1.1, 1.2, 2.5), 
                     y = c(0.5, 1, 2.1, 1.7)), 
                class = "data.frame", 
                row.names = c(NA, -4L))

line <- data.frame(
  x = cumsum(runif(50, max = 0.1)),
  y = cumsum(runif(50, max = 0.1))
)

ggplot(dat, aes(x = x, y = y)) +
  geom_polygon(aes(color = "Border", group = id), fill = NA) +
  geom_line(data = line, aes(colour = "Line"), size = 1) +
  theme(legend.background = element_rect(fill = "transparent"), 
        legend.box.background = element_rect(fill = "transparent", colour = NA),
        legend.key = element_rect(fill = "transparent"))

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

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

Для линии вместо сопоставления с цветом я сопоставил «Линии» с типом линий и жесткими.закодировал цвет.Затем я установил шкалу типов линий, чтобы получить 1 сплошную линию.В guides я вынул заголовок для типа линии и установил порядок следования, так что сначала идет цвет, а затем тип линии.Теперь есть две легенды, но у нижней нет названия.Чтобы они выглядели как одна непрерывная легенда, установите отрицательный интервал между легендами.Конечно, это не сработает, если у вас есть другая легенда, и в этом случае вам понадобятся разные трюки.

library(ggplot2)

ggplot(dat, aes(x = x, y = y)) +
  geom_polygon(aes(color = "Border", group = id), fill = NA) +
  geom_line(aes(linetype = "Line"), data = line, color = "blue") +
  scale_linetype_manual(values = 1) +
  guides(linetype = guide_legend(title = NULL, order = 2), color = guide_legend(order = 1)) +
  theme(legend.background = element_rect(fill = "transparent"), 
        legend.box.background = element_rect(fill = "transparent", colour = NA),
        legend.key = element_rect(fill = "transparent"), 
        legend.spacing = unit(-1, "lines") )

Обратите внимание, что есть несколькодля этого вы можете использовать разные комбинации эстетики, а не только цвет + тип линии.Вместо этого вы можете отобразить заливку многоугольника, а затем установить его альфа на 0, чтобы создать легенду заливки, но на самом деле не выглядит заполненной.

0 голосов
/ 13 июня 2018

Должны ли они быть частью одной и той же легенды?Если нет, то вы можете использовать эстетику заливки для многоугольника и эстетику цвета для линии:

ggplot(dat, aes(x = x, y = y)) +
    geom_polygon(aes(fill = "Border", group = id), colour="black") +
    geom_line(data = line, aes(colour = "Line"), size = 1) +
    scale_fill_manual(values=c(NA))
...