Home > Software design >  How to get rid of points in legends with ggnewscale?
How to get rid of points in legends with ggnewscale?

Time:01-20

I have a plot made with ggplot where the legends adds extra black points to all the other legends (see image).

enter image description here

library(tidyverse)
library(ggnewscale)
set.seed(12345)
brks = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
fd = expand.grid(x = seq(6,16, length.out = 100), 
                 y = seq(6,18, length.out = 100))
fd$z = sample(x = seq(0,1, length.out = 100), size = nrow(fd), replace = T)
df.t = data.frame(s = LETTERS[1:5], l = c(11,12,8,15,14), d = c(13,10,7,16,8))
mypal = data.frame(A = "black", B = "red",C = "blue", D = "green", E = "yellow")
summmmmmmm = expand.grid(s = LETTERS[1:5], 
                         yr = 1995:2012)
summmmmmmm$yr = as.factor(summmmmmmm$yr)
summmmmmmm$l = NA
summmmmmmm$d = NA
summmmmmmm[summmmmmmm$s == "A","l"] = rnorm(n = 18, mean = 11, sd = .5)
summmmmmmm[summmmmmmm$s == "B","l"] = rnorm(n = 18, mean = 12, sd = .5)
summmmmmmm[summmmmmmm$s == "C","l"] = rnorm(n = 18, mean = 8, sd = .5)
summmmmmmm[summmmmmmm$s == "D","l"] = rnorm(n = 18, mean = 15, sd = .5)
summmmmmmm[summmmmmmm$s == "E","l"] = rnorm(n = 18, mean = 14, sd = .5)
summmmmmmm[summmmmmmm$s == "A","d"] = rnorm(n = 18, mean = 13, sd = .5)
summmmmmmm[summmmmmmm$s == "B","d"] = rnorm(n = 18, mean = 10, sd = .5)
summmmmmmm[summmmmmmm$s == "C","d"] = rnorm(n = 18, mean = 8, sd = .5)
summmmmmmm[summmmmmmm$s == "D","d"] = rnorm(n = 18, mean = 16, sd = .5)
summmmmmmm[summmmmmmm$s == "E","d"] = rnorm(n = 18, mean = 9, sd = .5)
ggplot(data = fd, mapping = aes(x = x, y = y, z = z))   
  geom_contour_filled(breaks = brks) 
  geom_point(data = df.t, 
             mapping = aes(x = l, y = d, color = s), inherit.aes = FALSE, size = 5)   
  scale_fill_manual(values =  alpha(hcl.colors(100, "YlOrRd", rev = TRUE, alpha = 1), .99)) 
  scale_color_manual(values = alpha(mypal,1), 
                     name = "obj") 
  new_scale_color()  
  geom_point(data = summmmmmmm, 
             mapping = aes(x = l, y = d, 
                           color = yr, group = s), 
             shape = 19, 
             inherit.aes = FALSE, 
             show.legend = TRUE)   
  geom_path(data = summmmmmmm[order(summmmmmmm$yr),], 
            mapping = aes(x = l, y = d, color = yr, 
                          group = as.factor(s)), inherit.aes = FALSE, 
            show.legend = FALSE)  
  scale_color_viridis_d(name = "time")

I'd like to get rid of those extra points. Also, I like the 'time' legend to be in 2 columns, but not the other legends. Is there a way to do this?

CodePudding user response:

You need to use guide = guide_legend(ncol = 2) in your viridis scale to get two columns.

You can set show.legend = c(colour = TRUE, fill = FALSE) in the second point layer, to specifically show the legend in colour scales but not in fill scales.

See example below (where I've renamed summmmmmmm to df for my own sanity)

ggplot(data = fd, mapping = aes(x = x, y = y, z = z))   
  geom_contour_filled(breaks = brks) 
  geom_point(
    data = df.t, 
    mapping = aes(x = l, y = d, color = s), inherit.aes = FALSE, size = 5
  )   
  scale_fill_manual(
    values =  alpha(hcl.colors(100, "YlOrRd", rev = TRUE, alpha = 1), .99)
  ) 
  scale_color_manual(values = alpha(mypal,1), name = "obj") 
  new_scale_color()  
  geom_point(
    data = df, 
    mapping = aes(x = l, y = d, color = yr, group = s), 
    shape = 19, inherit.aes = FALSE, 
    show.legend = c(colour = TRUE, fill = FALSE)
  )   
  geom_path(
    data = df[order(df$yr),], 
    mapping = aes(x = l, y = d, color = yr, group = as.factor(s)), 
    inherit.aes = FALSE, show.legend = FALSE
  )  
  scale_color_viridis_d(name = "time", guide = guide_legend(ncol = 2))

  • Related