Управление легендой с двумя фреймами данных различных x-масштабов и различных Геом в ggplot2


Не мог бы кто-нибудь объяснить мне, как получить полный контроль над легендами в ggplot2 с двумя фреймами данных с разными масштабами x, представленными в двух разных геомах. 'Name1' и 'name2' - это функции, созданные с помощью других функций фильтрации.

1. Почему форма geom_point появляется в легенде для "группы 1"? Я ожидаю, что легенда будет показывать только цвет в группе 1 и форму для Группы 2.

Можно ли также переставить легенды? то есть появляется группа 2 первый в ряду.

df1 <- data.frame(g1 = c("a", "b", "c", "e"),
                  y1 = c(12, 8, 3, 20))
df2 <- data.frame(g1 = letters[1:5],
                  y1 = 20:24)
name1 <- "Group 1"
name2 <- "Group 2"

require(ggplot2)
ggplot(NULL, aes(x=g1, y=y1)) +
    geom_bar(data = df1, stat = "identity",
             aes(fill=factor(name1))) +
    geom_point(data = df2, stat = "identity",
               size = 5, shape = 2, aes(fill=factor(name2))) +
    theme(plot.margin = unit(c(2,1,1,1), "lines"),
                     plot.title = element_text(hjust = 0, size=18),
                     axis.title = element_text(face = "bold", size = 12),
                     legend.position = 'top',
                     legend.text = element_text(size = 12),
                     legend.title = element_blank())
1 2

1 ответ:

Ключ состоит в том, чтобы определить fill и shape в обоих aes(). Затем вы можете определить shape и fill Как NA для того, который вам не нужен.

ggplot(NULL, aes(x=g1, y=y1)) +
  geom_bar(data = df1, stat = "identity", aes(fill=name2, shape=name2)) +
  geom_point(data = df2, size = 5, aes(shape=name1, fill=name1)) +
  theme(plot.margin = unit(c(2,1,1,1), "lines"),
        plot.title = element_text(hjust = 0, size=18),
        axis.title = element_text(face = "bold", size = 12),
        legend.position = 'top',
        legend.text = element_text(size = 12),
        legend.title = element_blank()) +
  scale_shape_manual(values=c(2, NA)) +
  scale_fill_manual(values=c(NA, "red")) +
  guides(fill = guide_legend(reverse = TRUE),
         shape = guide_legend(reverse = TRUE))

Введите описание изображения здесь