New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multiple new_scale_fill doesn't work. #45
Comments
Thanks for the report. devtools::install_github("eliocamp/ggnewscale@v0.4.3") Output: library(data.table)
library(ggplot2)
library(ggnewscale)
packageVersion("ggnewscale")
#> [1] '0.4.3'
plot_data <-
data.table(X = c(rnorm(300, 5, 2), rnorm(300, 5, 2),rnorm(300, 5, 2),rnorm(300, 5, 2)),
Y = c(rnorm(300, 5, 1), rnorm(300, 10, 1),rnorm(300, 15, 1),rnorm(300, 20, 1)),
Label = c(rep('A', 300), rep('B', 300), rep('C', 300), rep('D', 300)))
ggplot() +
new_scale_fill() +
geom_bin2d(data=plot_data[Label=="A"],aes(x=X, y=Y))+
scale_fill_continuous(low = "red", high = "white")+
new_scale_fill() +
geom_bin2d(data=plot_data[Label=="B"],aes(x=X, y=Y))+
scale_fill_continuous(low = "green", high = "white") +
new_scale_fill() +
geom_bin2d(data=plot_data[Label=="C"],aes(x=X, y=Y))+
scale_fill_continuous(low = "blue", high = "white") +
new_scale_fill() +
geom_bin2d(data=plot_data[Label=="D"],aes(x=X, y=Y))+
scale_fill_continuous(low = "purple", high = "white") Created on 2022-04-04 by the reprex package (v2.0.1) |
Just installed version 0.4.3, and it runs as intended. Thank you for your help. |
Update to this bug: It seems to be caused by default mapping. Summary: library(data.table)
library(ggplot2)
library(ggnewscale)
packageVersion("ggnewscale")
#> [1] '0.4.8.9000'
set.seed(42)
plot_data <-
data.table(X = c(rnorm(300, 5, 2), rnorm(300, 5, 2),rnorm(300, 5, 2),rnorm(300, 5, 2)),
Y = c(rnorm(300, 5, 1), rnorm(300, 10, 1),rnorm(300, 15, 1),rnorm(300, 20, 1)),
Label = c(rep('A', 300), rep('B', 300), rep('C', 300), rep('D', 300))) Adding one extra scale works correctly ggplot(mapping = aes(x = X, y = Y)) +
geom_bin2d(data = plot_data[Label=="A"]) +
scale_fill_continuous("1", low = "red", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="B"]) +
scale_fill_continuous("2", low = "green", high = "white") But adding an extra one breaks everything ggplot(mapping = aes(x = X, y = Y)) +
geom_bin2d(data = plot_data[Label=="A"]) +
scale_fill_continuous("1", low = "red", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="B"]) +
scale_fill_continuous("2", low = "green", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="C"]) +
scale_fill_continuous("3", low = "blue", high = "white") This still works with explicit mapping ggplot(mapping = aes(x = X, y = Y)) +
geom_bin2d(data = plot_data[Label=="A"], aes(fill = after_stat(count))) +
scale_fill_continuous("1", low = "red", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="B"], aes(fill = after_stat(count))) +
scale_fill_continuous("2", low = "green", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="C"], aes(fill = after_stat(count))) +
scale_fill_continuous("3", low = "blue", high = "white") Created on 2023-05-08 with reprex v2.0.2 |
Well, this took forever to fix, but it now is. The new version is on its way to CRAN. |
Not fully, I am afraid... There still is an issue e.g. when the third scale is discrete while 1 & 2 are continuous:
fails with |
@jan-glx Your example fails in part because the second layer indeed uses a discrete scale for a continuous value. However, fixing that error shows that there's still an issue in ggnewscale. library(data.table)
library(ggplot2)
library(ggnewscale)
plot_data <-
data.table(X = c(rnorm(300, 5, 2), rnorm(300, 5, 2),rnorm(300, 5, 2),rnorm(300, 5, 2)),
Y = c(rnorm(300, 5, 1), rnorm(300, 10, 1),rnorm(300, 15, 1),rnorm(300, 20, 1)),
Label = c(rep('A', 300), rep('B', 300), rep('C', 300), rep('D', 300)))
ggplot(mapping = aes(x = X, y = Y)) +
geom_bin2d(data = plot_data[Label=="A"], aes(fill = after_stat(count))) +
scale_fill_gradient("1", low = "red", high = "white") +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="B"], aes(fill = after_stat(as.character(count)))) +
scale_fill_discrete() +
new_scale_fill() +
geom_bin2d(data = plot_data[Label=="C"], aes(fill = after_stat(as.character(round(count))))) +
scale_fill_discrete()
#> Error in `scale_fill_discrete()`:
#> ! Continuous values supplied to discrete scale
#> ℹ Example values: 1, 1, 1, 1, and 2
#> Backtrace:
#> ▆
#> 1. ├─base::tryCatch(...)
#> 2. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 3. │ ├─base (local) tryCatchOne(...)
#> 4. │ │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 5. │ └─base (local) tryCatchList(expr, names[-nh], parentenv, handlers[-nh])
#> 6. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 7. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 8. ├─base::withCallingHandlers(...)
#> 9. ├─base::saveRDS(...)
#> 10. ├─base::do.call(...)
#> 11. ├─base (local) `<fn>`(...)
#> 12. └─global `<fn>`(input = base::quote("flat-ram_reprex.R"))
#> 13. └─rmarkdown::render(input, quiet = TRUE, envir = globalenv(), encoding = "UTF-8")
#> 14. └─knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
#> 15. └─knitr:::process_file(text, output)
#> 16. ├─base::withCallingHandlers(...)
#> 17. ├─base::withCallingHandlers(...)
#> 18. ├─knitr:::process_group(group)
#> 19. └─knitr:::process_group.block(group)
#> 20. └─knitr:::call_block(x)
#> 21. └─knitr:::block_exec(params)
#> 22. └─knitr:::eng_r(options)
#> 23. ├─knitr:::in_input_dir(...)
#> 24. │ └─knitr:::in_dir(input_dir(), expr)
#> 25. └─knitr (local) evaluate(...)
#> 26. └─evaluate::evaluate(...)
#> 27. └─evaluate:::evaluate_call(...)
#> 28. ├─evaluate (local) handle(...)
#> 29. │ └─base::try(f, silent = TRUE)
#> 30. │ └─base::tryCatch(...)
#> 31. │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 32. │ └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 33. │ └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#> 34. ├─base::withCallingHandlers(...)
#> 35. ├─base::withVisible(value_fun(ev$value, ev$visible))
#> 36. └─knitr (local) value_fun(ev$value, ev$visible)
#> 37. └─knitr (local) fun(x, options = options)
#> 38. ├─base::withVisible(knit_print(x, ...))
#> 39. ├─knitr::knit_print(x, ...)
#> 40. └─knitr:::knit_print.default(x, ...)
#> 41. └─evaluate (local) normal_print(x)
#> 42. ├─base::print(x)
#> 43. └─ggplot2:::print.ggplot(x)
#> 44. ├─ggplot2::ggplot_build(x)
#> 45. └─ggplot2:::ggplot_build.ggplot(x)
#> 46. └─base::lapply(data, npscales$train_df)
#> 47. └─ggplot2 (local) FUN(X[[i]], ...)
#> 48. └─ggplot2 (local) train_df(..., self = self)
#> 49. └─base::lapply(self$scales, function(scale) scale$train_df(df = df))
#> 50. └─ggplot2 (local) FUN(X[[i]], ...)
#> 51. └─scale$train_df(df = df)
#> 52. └─ggplot2 (local) train_df(..., self = self)
#> 53. └─self$train(df[[aesthetic]])
#> 54. └─ggplot2 (local) train(..., self = self)
#> 55. └─cli::cli_abort(...)
#> 56. └─rlang::abort(...) The issue will be resolved in a new version which refactors the code and avoids a lot of the annoying logic that created this issue in the first place. |
Ooops, based on the text I wrote, I guess I meant the first |
Hello. I ran into a problem with using multiple
new_scale_fill
. It doesn't seems to work for me when I used more than two. Please see the example belows.Using
fill
under ggplot. There's 4 groups.Using a single
new_scale_fill
Using two
new_scale_fill
Using three
new_scale_fill
Using four
new_scale_fill
I'm taking this approach because I want to use new_scale_fill in a for loop situation. Such as below.
As you can see, when using multiple new_scale_fill, the output was not what I was expecting, something similar to the first figure. I tried going through stackoverflow.com, but most example are only using two
new_scale_fill
.The text was updated successfully, but these errors were encountered: