Remove legend elements of one specific geom: “show.legend = FALSE” does not do the job

前端 未结 2 1917
醉梦人生
醉梦人生 2021-01-19 07:32

I have written an answer here and would like to improve it. What I would like to do is to remove the legend for geom_path but it is not working with show.

相关标签:
2条回答
  • 2021-01-19 08:11

    Another possibility (but more overall work) is to manually specify the colors for the arrows:

    library(ggplot2)
    library(tidyr)
    library(dplyr)
    
    ggplot2df <- read.table(text = "question y2015 y2016
    q1 90 50
    q2 80 60
    q3 70 90
    q4 90 60
    q5 30 20", header = TRUE)
    
    ggplot2df %>% 
      mutate(direction = ifelse(y2016 - y2015 > 0, "Up", "Down")) %>%
      gather(variable, value, -question, -direction) -> df
    
    gg <- ggplot(df, aes(x=question, y = value, group = question)) 
    gg <- gg + geom_point(aes(color=variable), size=4) 
    gg <- gg + geom_path(color=c("red", "red", "green", rep("red", 4), "green", "red", "red"),
                         arrow=arrow(), show.legend=FALSE)  
    gg
    

    0 讨论(0)
  • 2021-01-19 08:30

    I think what's going on is that because both variable and direction are mapped to color, the legend has four different color values. Removing the path legend just removes the arrows, while removing just the point legend removes the points. But either way, all four colors still show up in the legend, as points or arrows, respectively, because the underlying mapping still has four values, regardless of whether you choose to manifest those four values as points, arrows, or both in the legend.

    One way around this would be to use a fill aesthetic for the points. Then the path legend will have only two values. To do this, you have to use a point style with a filled interior (pch values 21 - 25). You'll also need to change the colors of either the color aesthetic or fill aesthetic, so that they won't be the same:

    ggplot(df, aes(x=question, y = value, group = question)) + 
      geom_point(size=4, aes(fill=variable), pch=21, color=NA) + 
      geom_path(aes(color = direction), arrow=arrow(), show.legend=FALSE) +
      scale_fill_manual(values=hcl(c(105,285), 100, 50))
    

    0 讨论(0)
提交回复
热议问题