ggnewscale icon indicating copy to clipboard operation
ggnewscale copied to clipboard

Legend coloring issue when plotting multiple legends for different geom_point layers

Open janstrauss1 opened this issue 3 years ago • 3 comments

Hi @eliocamp,

Many thanks for your time and effort to develop ggnewscale!

Unfortunately, I'm currently having some issues with the correct coloring of my legend when plotting multiple legends for two geom_point layers using color as single aesthetic. Not sure if it's a bug or just some big oversight of myself...

Please see a reprex below to illustrate my issue. What I'm trying to achieve are two legends with blue, orange and green points, one with filled colored points using geom_point(shape = 19...) and one with open circles using geom_point(shape = 21...) (like in the bottom plot).

Yet, somehow the coloring of my points in the legend get messed up?!

Many thanks for any feedback and help!

library(tidyverse)
library(ggnewscale)

## make example data
set.seed(123)
d <- tibble(
  feature = rep(base::factor(c("feature1","feature2")), 54),
  name = rep(base::factor(c("name1", "name2", "name3")), 36),
  x = runif(108, min = 0.1, max = 100),
  y = runif(108, min = 0.1, max = 100)
  )

## Point scatterplot with two legends
ggplot(data = d, aes(x = x, y = y)) +
  geom_point(shape = 19, data = subset(d, feature == "feature1"), aes(color = name), size = 3, show.legend = TRUE) +
  scale_color_manual(name = "feature1", values = c("blue", "orange", "green")) +
  new_scale_color() + # geoms below will use another color scale
  geom_point(shape = 21, data = subset(d, feature == "feature2"), aes(color = name), size = 3, show.legend = TRUE) +
  scale_color_manual(name = "feature2", values = c("blue", "orange", "green")) +
  geom_abline(linetype = "dashed") +
  xlim(0, 100) + ylim(0, 100) +
  theme_bw()

ggplot(data = d, aes(x = x, y = y)) +
  geom_point(shape = 19, data = subset(d, feature == "feature1"), aes(color = name), size = 3, show.legend = FALSE) +
  scale_color_manual(name = "feature1", values = c("blue", "orange", "green")) +
  new_scale_color() + # geoms below will use another color scale
  geom_point(shape = 21, data = subset(d, feature == "feature2"), aes(color = name), size = 3, show.legend = TRUE) +
  scale_color_manual(name = "feature2", values = c("blue", "orange", "green")) +
  geom_abline(linetype = "dashed") +
  xlim(0, 100) + ylim(0, 100) +
  theme_bw()

Created on 2021-06-07 by the reprex package (v2.0.0)

sessionInfo()
#> R version 4.0.5 (2021-03-31)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Catalina 10.15.7
#> 
#> Matrix products: default
#> BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
#> 
#> locale:
#> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#>  [1] digest_0.6.27      withr_2.4.2        lifecycle_1.0.0    magrittr_2.0.1    
#>  [5] reprex_2.0.0       evaluate_0.14      highr_0.9          stringi_1.6.2     
#>  [9] rlang_0.4.11       cli_2.5.0          rstudioapi_0.13    fs_1.5.0          
#> [13] vctrs_0.3.8        rmarkdown_2.8      tools_4.0.5        stringr_1.4.0.9000
#> [17] glue_1.4.2         xfun_0.23          yaml_2.2.1         compiler_4.0.5    
#> [21] htmltools_0.5.1.1  knitr_1.33

Created on 2021-06-07 by the reprex package (v2.0.0)

janstrauss1 avatar Jun 07 '21 07:06 janstrauss1

I started removing some bits of (probably unnecesary) code and I think that if you remove the show.legend = TRUE bits you can get the result you want. I have no idea why that's necesary, though, but hopefuly this is good enough for you right now until I can publish a proper fix.

library(ggplot2)
library(ggnewscale)

set.seed(123)
d <- data.frame(
  feature = rep(base::factor(c("feature1","feature2")), 54),
  name = rep(base::factor(c("name1", "name2", "name3")), 36),
  x = runif(108, min = 0.1, max = 100),
  y = runif(108, min = 0.1, max = 100)
)



ggplot(data = d, aes(x = x, y = y)) +
  geom_point(shape = 19, data = subset(d, feature == "feature1"), aes(color = name), size = 3) +
  scale_color_manual(name = "feature1", values = c("blue", "orange", "green")) +
  new_scale_color() +
  geom_point(shape = 21, data = subset(d, feature == "feature2"), aes(color = name), size = 3) +
  scale_color_manual(name = "feature2", values = c("blue", "orange", "green")) 

Created on 2021-06-07 by the reprex package (v2.0.0)

eliocamp avatar Jun 07 '21 13:06 eliocamp

Hi @eliocamp,

That's certainly good enough for me.

I actually used the show.legend argument initially only for testing and playing around with different ggplot() settings. Wouldn't have expected that this might affect my plotting results.

Many thanks for your help!

janstrauss1 avatar Jun 07 '21 14:06 janstrauss1

Good to know. I'll leave this issue open because I feel that this is a genuine bug.

eliocamp avatar Jun 07 '21 14:06 eliocamp

I'll close this since it's likely the same as #59.

eliocamp avatar Jul 18 '24 19:07 eliocamp