plotly / plotly/plotly.R

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

Offen
#1,781 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
R
Sterne
2.7k
Forks
641
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere das Problem mit den bereitgestellten R-Beispielen unter Verwendung von plot_ly(), add_trace(), surface-Traces und opacityscale und vergleiche anschließend die Darstellung mit und ohne opacityscale. Verfolge das Verhalten durch die in Issue 4331 referenzierte plotly.js-Implementierung; abgeschlossen ist die Aufgabe, wenn die surface-Reihenfolge bei vorhandenem opacityscale der Tiefenreihenfolge statt der Reihenfolge des Hinzufügens der Traces folgt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, r
Bereich
data-visualization
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.