Различные легендарные ключи внутри одной легенды в 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
для обоих, потому что он будет принимать только один масштаб.