eliocamp / ggnewscale

Multiple Fill, Color and Other Scales in `ggplot2`
https://eliocamp.github.io/ggnewscale/
GNU General Public License v3.0
406 stars 18 forks source link

Legend coloring issue when plotting multiple legends for different geom_point layers #32

Closed janstrauss1 closed 4 months ago

janstrauss1 commented 3 years ago

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)

eliocamp commented 3 years ago

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)

janstrauss1 commented 3 years ago

Hi @eliocamp,

That's certainly good enough for me.

I actually used the show.legendargument 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!

eliocamp commented 3 years ago

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

eliocamp commented 4 months ago

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