Using opacityscale with surface results in ordering by addition order, not depth
Personne n'a encore pris cette issue.
- Langage dominant
- R
- Étoiles
- 2.7k
- Forks
- 641
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
Hi, been using plotly with R for a while now and really loving it - thanks for assembling such a phenomenal program! I'd like to report a bug found while plotting multiple surface objects, which causes them to layer in the order they're added (using %>%) rather than the "depth" at which they should really render in the figure. See below for code and examples.
The "opacityscale" function is a new one from the dev branch (and I don't think problems with it have been reported on here before) so this question may be a better fit for https://github.com/plotly/plotly.js instead, where there's a bit more discussion about it and the original implementation, but I don't know JavaScript and can't provide a reprex there.
This is great:

This is not great (same figure rotated to look from below):

It only seems to show up if the opacityscale parameter is added, even if the opacity is set to 1 for all values.
Renders fine:
# devtools::install_github("ropensci/plotly")
library(plotly)
df <- data.frame(x=1:10, y=1:10)
surface_data <- matrix(1:100, nrow=10, ncol=10)
z_mat <- matrix(0, nrow = 10, ncol = 10)
plot_ly(df, x=~x, y=~y) %>%
add_trace(type="surface",
z=z_mat,
surfacecolor=surface_data,
colorscale=list(list(0, 1), list("red", "orange"))) %>%
add_trace(type = "surface",
z = z_mat+2,
surfacecolor=surface_data,
colorscale = list(list(0, 1), list("yellow", "green"))) %>%
add_trace(type = "surface",
z = z_mat+1,
surfacecolor=surface_data,
colorscale = list(list(0, 1), list("blue", "purple")))

Does not render fine:
plot_ly(df, x=~x, y=~y) %>%
add_trace(type="surface",
z=z_mat,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale=list(list(0, 1), list("red", "orange"))) %>%
add_trace(type = "surface",
z = z_mat+1,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale = list(list(0, 1), list("yellow", "green"))) %>%
add_trace(type = "surface",
z = z_mat+2,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale = list(list(0, 1), list("blue", "purple")))

I've had a little trouble figuring out exactly how to best pass the opacityscale argument in R but I believe these settings should disable the opacity completely by setting every value between 0 and 1 to an opacity between 1 and 1 (i.e., always 1 and fully opaque).
Additionally, the surface that renders on "top" is the one that's added last in the piping order. If we alter the above code a little bit to render the purple/blue surface before the yellow/green one, we get some more interesting renders:
plot_ly(df, x=~x, y=~y) %>%
add_trace(type="surface",
z=z_mat,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale=list(list(0, 1), list("red", "orange"))) %>%
add_trace(type = "surface",
z = z_mat+2,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale = list(list(0, 1), list("blue", "purple"))) %>%
add_trace(type = "surface",
z = z_mat+1,
surfacecolor=surface_data,
opacityscale=list(list(0, 1), list(1, 1)),
colorscale = list(list(0, 1), list("yellow", "green")))


Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez le problème avec les exemples R fournis en utilisant plot_ly(), add_trace(), des traces surface et opacityscale, puis comparez le rendu avec et sans opacityscale. Suivez le comportement dans l’implémentation de plotly.js référencée par l’issue 4331 ; le travail est terminé lorsque l’ordre des surfaces suit la profondeur plutôt que l’ordre d’ajout des traces quand opacityscale est présent.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- javascript, r
- Domaine
- data-visualization
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100