ggnewscale
ggnewscale copied to clipboard
Legend coloring issue when plotting multiple legends for different geom_point layers
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)
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)
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!
Good to know. I'll leave this issue open because I feel that this is a genuine bug.
I'll close this since it's likely the same as #59.