Skip to content

3D scatter plot not drawn by z-axis order when alpha != 1 #2049

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

Open
schuemie opened this issue Oct 19, 2021 · 3 comments
Open

3D scatter plot not drawn by z-axis order when alpha != 1 #2049

schuemie opened this issue Oct 19, 2021 · 3 comments

Comments

@schuemie
Copy link

When creating a 3D scatter plot, the dots should be drawn in the order of depth, so drawing the furthest dot first, to get the right occlusion. This works well when alpha = 1, but when alpha < 1 the dots seem to be drawn in order of categories instead.

Here's a simple example. If you rotate it so the green dot is at the forefront, it is nevertheless occluded by the blue dot:

library(plotly)
plot_ly(data = data.frame(x = c(1, 1),
                          y = c(1, 2), 
                          z = c(1, 1), 
                          class = c("A", "B")),
        x = ~x, 
        y = ~y, 
        z = ~z, 
        color = ~class,
        alpha = 0.9)

Capture

This especially problematic when you have a lot of dots, and a cluster of nearby dots is completely hidden by a faraway cluster of dots of a different color.

> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plotly_4.10.0 ggplot2_3.3.5

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.7         pillar_1.6.4       compiler_4.0.3     later_1.3.0        RColorBrewer_1.1-2 tools_4.0.3        digest_0.6.28     
 [8] viridisLite_0.4.0  jsonlite_1.7.2     lifecycle_1.0.1    tibble_3.1.5       gtable_0.3.0       pkgconfig_2.0.3    rlang_0.4.11      
[15] shiny_1.7.1        DBI_1.1.1          crosstalk_1.1.1    yaml_2.2.1         fastmap_1.1.0      httr_1.4.2         withr_2.4.2       
[22] dplyr_1.0.7        htmlwidgets_1.5.4  generics_0.1.0     vctrs_0.3.8        grid_4.0.3         tidyselect_1.1.1   data.table_1.14.2 
[29] glue_1.4.2         R6_2.5.1           fansi_0.5.0        farver_2.1.0       tidyr_1.1.4        purrr_0.3.4        magrittr_2.0.1    
[36] scales_1.1.1       promises_1.2.0.1   ellipsis_0.3.2     htmltools_0.5.2    assertthat_0.2.1   mime_0.12          colorspace_2.0-2  
[43] xtable_1.8-4       httpuv_1.6.3       utf8_1.2.2         lazyeval_0.2.2     munsell_0.5.0      crayon_1.4.1   
@brooksambrose
Copy link

brooksambrose commented Feb 1, 2022

Pro tip, search if the issue exists before wasting time on a reprex 😂. I would add that this is an especially prevalent bug since the default is to render 3D bubbles and apply transparency when using the size argument.

library(plotly)
d<-rbind(
  data.frame(x=3,y=3,z=3,g='A')
  ,data.frame(x=2,y=2,z=2,g='B')
  ,data.frame(x=1,y=1,z=1,g='C')
)

p<-plot_ly(d,x=~x,y=~y,z=~z,color=~g,size=~I(pi*1000*(3:1)^2))
# Fine
p %>% add_markers(marker=list(opacity=1))

newplot (1)

# Far points render in front of near points
p %>% add_markers(marker=list(opacity=.99))

newplot

Created on 2022-01-31 by the reprex package (v2.0.1)

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.1.2 (2021-11-01)
#>  os       macOS Monterey 12.1
#>  system   aarch64, darwin20.6.0
#>  ui       unknown
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       America/Los_Angeles
#>  date     2022-01-31
#>  pandoc   2.14.0.3 @ /Applications/RStudio.app/Contents/MacOS/pandoc/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package      * version date (UTC) lib source
#>  backports      1.2.1   2020-12-09 [1] CRAN (R 4.1.1)
#>  callr          3.7.0   2021-04-20 [1] CRAN (R 4.1.1)
#>  cli            3.1.0   2021-10-27 [1] CRAN (R 4.1.1)
#>  colorspace     2.0-2   2021-06-24 [1] CRAN (R 4.1.1)
#>  crayon         1.4.2   2021-10-29 [1] CRAN (R 4.1.1)
#>  crosstalk      1.1.1   2021-01-12 [1] CRAN (R 4.1.1)
#>  curl           4.3.2   2021-06-23 [1] CRAN (R 4.1.1)
#>  data.table     1.14.3  2021-10-04 [1] local
#>  digest         0.6.29  2021-12-01 [1] CRAN (R 4.1.2)
#>  dplyr          1.0.7   2021-06-18 [1] CRAN (R 4.1.1)
#>  ellipsis       0.3.2   2021-04-29 [1] CRAN (R 4.1.1)
#>  evaluate       0.14    2019-05-28 [1] CRAN (R 4.1.1)
#>  fansi          1.0.0   2022-01-10 [1] CRAN (R 4.1.2)
#>  farver         2.1.0   2021-02-28 [1] CRAN (R 4.1.1)
#>  fastmap        1.1.0   2021-01-25 [1] CRAN (R 4.1.1)
#>  fs             1.5.2   2021-12-08 [1] CRAN (R 4.1.2)
#>  generics       0.1.1   2021-10-25 [1] CRAN (R 4.1.1)
#>  ggplot2      * 3.3.5   2021-06-25 [1] CRAN (R 4.1.1)
#>  glue           1.6.0   2021-12-17 [1] CRAN (R 4.1.2)
#>  gtable         0.3.0   2019-03-25 [1] CRAN (R 4.1.1)
#>  highr          0.9     2021-04-16 [1] CRAN (R 4.1.1)
#>  htmltools      0.5.2   2021-08-25 [1] CRAN (R 4.1.1)
#>  htmlwidgets    1.5.4   2021-09-08 [1] CRAN (R 4.1.1)
#>  httr           1.4.2   2020-07-20 [1] CRAN (R 4.1.1)
#>  jsonlite       1.7.2   2020-12-09 [1] CRAN (R 4.1.1)
#>  knitr          1.37    2021-12-16 [1] CRAN (R 4.1.2)
#>  lazyeval       0.2.2   2019-03-15 [1] CRAN (R 4.1.1)
#>  lifecycle      1.0.1   2021-09-24 [1] CRAN (R 4.1.1)
#>  magrittr       2.0.2   2022-01-26 [1] CRAN (R 4.1.2)
#>  mime           0.12    2021-09-28 [1] CRAN (R 4.1.1)
#>  munsell        0.5.0   2018-06-12 [1] CRAN (R 4.1.1)
#>  pillar         1.6.4   2021-10-18 [1] CRAN (R 4.1.1)
#>  pkgconfig      2.0.3   2019-09-22 [1] CRAN (R 4.1.1)
#>  plotly       * 4.10.0  2021-10-09 [1] CRAN (R 4.1.2)
#>  processx       3.5.2   2021-04-30 [1] CRAN (R 4.1.1)
#>  ps             1.6.0   2021-02-28 [1] CRAN (R 4.1.1)
#>  purrr          0.3.4   2020-04-17 [1] CRAN (R 4.1.1)
#>  R.cache        0.15.0  2021-04-30 [1] CRAN (R 4.1.1)
#>  R.methodsS3    1.8.1   2020-08-26 [1] CRAN (R 4.1.1)
#>  R.oo           1.24.0  2020-08-26 [1] CRAN (R 4.1.1)
#>  R.utils        2.11.0  2021-09-26 [1] CRAN (R 4.1.1)
#>  R6             2.5.1   2021-08-19 [1] CRAN (R 4.1.1)
#>  RColorBrewer   1.1-2   2014-12-07 [1] CRAN (R 4.1.1)
#>  reprex         2.0.1   2021-08-05 [1] CRAN (R 4.1.2)
#>  rlang          0.4.12  2021-10-18 [1] CRAN (R 4.1.1)
#>  rmarkdown      2.11    2021-09-14 [1] CRAN (R 4.1.1)
#>  rstudioapi     0.13    2020-11-12 [1] CRAN (R 4.1.1)
#>  scales         1.1.1   2020-05-11 [1] CRAN (R 4.1.1)
#>  sessioninfo    1.2.2   2021-12-06 [1] CRAN (R 4.1.2)
#>  stringi        1.7.6   2021-11-29 [1] CRAN (R 4.1.2)
#>  stringr        1.4.0   2019-02-10 [1] CRAN (R 4.1.1)
#>  styler         1.6.2   2021-09-23 [1] CRAN (R 4.1.1)
#>  tibble         3.1.6   2021-11-07 [1] CRAN (R 4.1.2)
#>  tidyr          1.1.4   2021-09-27 [1] CRAN (R 4.1.1)
#>  tidyselect     1.1.1   2021-04-30 [1] CRAN (R 4.1.1)
#>  utf8           1.2.2   2021-07-24 [1] CRAN (R 4.1.1)
#>  vctrs          0.3.8   2021-04-29 [1] CRAN (R 4.1.1)
#>  viridisLite    0.4.0   2021-04-13 [1] CRAN (R 4.1.1)
#>  webshot        0.5.2   2019-11-22 [1] CRAN (R 4.1.1)
#>  withr          2.4.3   2021-11-30 [1] CRAN (R 4.1.2)
#>  xfun           0.29    2021-12-14 [1] CRAN (R 4.1.2)
#>  xml2           1.3.3   2021-11-30 [1] CRAN (R 4.1.2)
#>  yaml           2.2.1   2020-02-01 [1] CRAN (R 4.1.1)
#> 
#>  [1] /opt/homebrew/lib/R/4.1/site-library
#>  [2] /opt/homebrew/Cellar/r/4.1.2/lib/R/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────

@twitwi
Copy link

twitwi commented Sep 4, 2023

cross referencing an issue on the js repo plotly/plotly.js#1267

@katossky
Copy link

It is even broken in the documentation : https://plotly.com/python/3d-scatter-plots (last plot at the bottom).

Enregistrement.de.l.ecran.2025-02-21.a.12.58.55.mov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants