Различные легендарные ключи внутри одной легенды в ggplot2

Скажем, мне не нужно "правильное" сопоставление переменных, но все же хотелось бы иметь ключи легенды, чтобы помочь понять диаграмму. Мои фактические данные похожи на следующие df

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))

library(ggplot2)

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, colour = "points"))

enter image description here

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

library(reshape2)

df <- melt(df, id.vars="id")

ggplot() +
  geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) +
  geom_line(aes(id, value, colour = variable), df[df$variable=="line",])

но он определяет две отдельные легенды. Исправить второй код (и изменить его данные) тоже было бы неплохо, но я предпочел бы, чтобы (вручную) изменить любой ключ легенды (и продолжать использовать первый подход). Спасибо!

ИЗМЕНИТЬ:

Спасибо @alexwhan, что вы обновили мою память о сопоставлении переменных. Тем не менее, самый простой способ, который я получил до сих пор, - это еще один (очень плохой взлом!):

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, shape = "points")) +
  theme(legend.title=element_blank())

который просто скрывает название двух разных легенд.

enter image description here

Другие идеи более чем приветствуются!!!

Ответ 1

Вы можете использовать override.aes= внутри guides(), чтобы изменить внешний вид легенды по умолчанию. В этом случае ваш проводник color=, а затем вы должны установить shape=c(NA,16) для удаления фигуры для строки, а затем linetype=c(1,0) для удаления строки из точки.

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, colour = "points"))+
  guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0))))

enter image description here

Ответ 2

Я не знаю, как легко это сделать, но вы можете сделать такую ​​взломанную версию (используя ваш расплавленный фрейм):

p <- ggplot(df.m, aes(id, value)) +
  geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) +
  geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1))

enter image description here

Ключ в том, что вам нужно получить правильное отображение, чтобы оно отображалось правильно в легенде. В этом случае, получив это "правильно", нужно обмануть его, чтобы он выглядел так, как вы этого хотите. Вероятно, стоит отметить, что это работает только потому, что вы можете установить linetype в пустую (0), а затем использовать шкалу alpha для точек. Вы не можете использовать alpha для обоих, потому что он будет принимать только один масштаб.