2016-05-03 2 views
3

Я делаю сюжет с двумя разными отображениями («группа» отображается на цвет и тип линии, а «на» отображается в форму). Я хотел бы объединить эти два отображения в одной легенде, но не могу получить форму в легенде.
Вот моя попытка:ggplot2: есть одна легенда для двух сопоставлений

set.seed(123) 
plotdata = cbind.data.frame(x = rep(1:5, times = 4), 
          y = rnorm(20), 
          from = rep(c("1","2"), each = 10), 
          to = rep(c("1","2"), times= 10)) 
plotdata = cbind.data.frame(plotdata, group = paste0(plotdata$from, "to", plotdata$to)) 

library(ggplot2) 

plot1 = ggplot(plotdata, aes(x = x, y = y, group = group, color = group, lty = group, shape = to)) + 
    geom_point() + geom_line() + theme_bw() + 
    scale_color_discrete(name = "", 
         breaks = c("1to1", "1to2", "2to1", "2to2"), 
         labels = c("1to1", "1to2", "2to1", "2to2")) + 
    scale_linetype_discrete(name = "", 
          breaks = c("1to1", "1to2", "2to1", "2to2"), 
          labels = c("1to1", "1to2", "2to1", "2to2")) + 
    scale_shape_manual(name = "", 
        values = c(1, 2, 1, 2), 
        breaks = c("1to1", "1to2", "2to1", "2to2"), 
        labels = c("1to1", "1to2", "2to1", "2to2")) 
print(plot1) 

plot

Как вы можете видеть на графике у меня есть одна легенда, но форма всегда круг.
Желаемое поведение: фигура в легенде чередуется между кругом и пирамидой, как на графике.

То, что я пробовал до сих пор, это указать форму вручную, но это не помогло, как вы можете видеть выше. Я также посмотрел на объект сюжета, надеясь, что смогу его манипулировать, но безрезультатно.

ответ

5

Вы можете получить одну легенду без override.aes. Просто установите shape=group, а также используйте scale_shape_manual для установки значений повторяющихся фигур. В этом случае вам не нужно карту to к чему-либо, потому что содержащаяся в нем информация избыточна:

ggplot(plotdata, aes(x = x, y = y, group = group, color = group, lty = group, 
        shape = group)) + 
    geom_point() + geom_line() + theme_bw() + 
    scale_color_discrete(name = "") + 
    scale_linetype_discrete(name = "") + 
    scale_shape_manual(name = "", values=c(1,2,1,2)) 

enter image description here

3

This Q&A помог мне: вам нужно указать форму явно в цветовой легенды с «override.aes»:

plot1 = ggplot(plotdata, aes(x = x, y = y, group = group, color = group, lty = group, shape = to)) + 
    geom_point() + geom_line() + theme_bw() + 
    scale_color_discrete(name = "", 
         breaks = c("1to1", "1to2", "2to1", "2to2"), 
         labels = c("1to1", "1to2", "2to1", "2to2"), 
         guide = guide_legend(override.aes = list(shape = rep(c(1, 2), 2)))) + 
    scale_linetype_discrete(name = "", 
          breaks = c("1to1", "1to2", "2to1", "2to2"), 
          labels = c("1to1", "1to2", "2to1", "2to2")) + 
    scale_shape_discrete(guide = F) 
plot1 

enter image description here

Заметим, однако, что вам нужно выяснить, правильно формирует себя. A reference might come handy.

Смежные вопросы