plotly / plotly/plotly.R

Using opacityscale with surface results in ordering by addition order, not depth

Ouverte
#1,781 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

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:

image

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

image

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"))) 

image

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")))

image

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")))

image

image

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. 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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.