plotly / plotly/plotly.py

graph_objs.volume and .isosurface not rendering non-cuboid

Ouverte
#3,933 6 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug P3
Langage dominant
Python
Étoiles
18.8k
Forks
2.8k
Merge moyen
16 h 26 min
PR mergées (30 j)
21

Description

I'm trying to use plotly in a dash app to render a cuboid, that's sheared to the y-axis.=it has a parallelogram as ground surface. It consists of individual points, each with a density value. plotly_express.scatter_3d renders the individual points correctly, but only has "2 views" when rotating it:

  • One where the closest face is rendered
  • -> you can't look inside very well
  • One where both the closest face and the inside of the structure are not rendered
  • -> you can only see the 2 rear side faces, but from the inside

With both, I'm losing a lot of information on the insides of my structure.
I think scatter_3d doesn't allow for

  • a) all points to stay rendered at all times
  • b) me to link each individual points opacity to its density value (like it does with color)¹

Best looking solution would be graph_objs.Volume or .isosurface, but they have an issue.

So far, the coordinates data had to be arranged to form an orthogonal cuboid, to render a volume.
My test data is not the same y-sheared cuboid I want to achieve, but it illustrates the issue of both graph_objs.

Test Data:
Using plotly_express.scatter_3d() for comparison, the following dataframe shows both Figures rendering the expected result:

DF = pd.DataFrame(data={
    'x': [0, 0, 0, 0, 0, 0, 1,1,1,1,1,1],
    'y': [0,0,0,1,1,1,0,0,0,1,1,1],
    'z': [0,1,2,0,1,2,0,1,2,0,1,2],
    'val': [1,1,1,1,1,1,1,1,1,1,1,1]})

scatter plot:
points

volume plot:
points volume

When removing 2 points at (0/1/2) & (1/1/2) -

DF = pd.DataFrame(data={
    'x': [0, 0, 0, 0, 0, 1,1,1,1,1],
    'y': [0,0,0,1,1,0,0,0,1,1],
    'z': [0,1,2,0,1,0,1,2,0,1],
    'val': [1,1,1,1,1,1,1,1,1,1]})
  • go.Volume breaks.

scatter plot:
scattermissing

volume plot:
vol missing

scatter_3d figure:

px.scatter_3d(
    DF,
    x='x',
    y='y',
    z='z',
    color='val',
    opacity=0.5,
    color_continuous_scale=px.colors.sequential.Inferno_r,
    range_color=[df.min()['val'], df.max()['val']],
    template=templ)

opacity doesn't take lists/ranges, so I can't use DF.val there.

Volume figure:

go.Figure(data=go.Volume(
    x=DF.x,
    y=DF.y,
    z=DF.z,
    value=DF.val,
    opacity=0.3,
    surface_count=17,
    colorscale=px.colors.sequential.Inferno_r
))

I played around with surface_count, but it doesn't seem to be causing the problem.

My 2 points being:

  • go.Volume/.isosurface don't work if angles of !=90° are involved
  • px.scatter_3d deserves some more configuration-options, especially opacity-wise

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

Reproduire les exemples fournis de plotly_express.scatter_3d et go.Volume, y compris les jeux de données complets et ceux comportant des points manquants. Commencer par les points d’entrée go.Volume et go.Isosurface et comparer leur comportement avec des coordonnées cisaillées et des points manquants. Done doit établir si ces entrées sont prises en charge et résoudre la limitation de rendu observée ou la documenter clairement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
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
35/100

Recevez les nouvelles issues par e-mail

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