plotly / plotly/plotly.py

Bug Report: go.Surface doesn't show the outthrust value!

Offen
#5,229 6 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug P1
Vorherrschende Sprache
Python
Sterne
18.8k
Forks
2.8k
Ø Merge
16 Std. 26 Min.
Gemergte PRs (30 T.)
21

Beschreibung

I'm coming to report another bug on the go.Surface.
As the code shown below, you can easily get the bug.
The plotly go.Surface only plots the Contour_Val in rectangular shape. It completely ignores those outthrust values in the 'Contour_Val' matrix.

The Matplotlib shows the correct surface(or contour).

import numpy as np
X=np.array([
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900., 8000.00, 8100.00, 8200., 8300., 8400., 8500.],
       [7800., 7900.00, 8000.00, 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900., 8000.00, 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.],
       [7800.,   7900.,   8000., 8100., 8200., 8300., 8400., 8500.]])

Y=np.array([
       [3800.,   3800.,   3800., 3800., 3800., 3800., 3800., 3800.],
       [3900.,   3900.,   3900., 3900., 3900., 3900., 3900., 3900.],
       [4000.,   4000.,   4000., 4000., 4000., 4000., 4000., 4000.],
       [4100.,   4100.,   4100., 4100., 4100., 4100., 4100., 4100.],
       [4200.,   4200.,   4200., 4200., 4200., 4200., 4200., 4200.],
       [4300.,   4300.,   4300., 4300., 4300., 4300., 4300., 4300.],
       [4400.,   4400., 4400.00, 4400.00, 4400., 4400., 4400., 4400.],
       [4500., 4500.00, 4500.00, 4500., 4500., 4500., 4500., 4500.],
       [4600.,   4600., 4600.00, 4600., 4600., 4600., 4600., 4600.],
       [4700.,   4700.,   4700., 4700., 4700., 4700., 4700., 4700.],
       [4800.,   4800.,   4800., 4800., 4800., 4800., 4800., 4800.]])

Contour_Val= np.array([
       [          np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan,         np.nan, 12169.04428749,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan,         np.nan, 12128.33946596, 12114.37604446,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan, 12146.50058674, 12110.75061221, 12094.0645444 ,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan, 12154.96379352, 12116.42568321,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan, 12186.79247811, 12145.38853514,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan, 12241.85245564, 12197.51679624,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan, 12385.14869121, 12319.78169639,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan, 12419.96884955,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan],
       [          np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan,         np.nan]])


# %% matplotlib version
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
ax.set_proj_type('ortho') 
ax.axis('equal')
surf = ax.contourf(X, Y, Contour_Val, zdir='z', 
                offset=50,  # plot at z=offset
                cmap='jet')
ax.set_xlim([X.min(), X.max()])
ax.set_ylim([Y.min(), Y.max()])
ax.set_zlim([0, 100])

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.view_init(elev=90, azim=0)

# show the figure
plt.show()
# %% plotly version
'''
bug: the outthrust values are not plotted!
'''
import plotly.graph_objects as go

plotz=50
Z=np.full_like(Contour_Val, plotz)
mask = np.isnan(Contour_Val) # mask for NaN values
Z[mask]=np.nan  # apply mask to Z

fig = go.Figure()
fig.add_trace( go.Surface(
    x=X.round(2), 
    y=Y.round(2), 
    z=Z.round(2),# plot contour on the plane z=plotz
    surfacecolor=Contour_Val, # use Contour_Val as the surface color

    text=Contour_Val.round(2),
    name='contour',
    
    colorscale='jet',

    showscale=True,
    opacity=0.8,  # <1 to make the contour plane semi-transparent

    hoverinfo='x+y+text+name', # works well

))

fig.show()

Matplotlib version (correct):

Image

Plotly version (wrong):

Image

only those values which form a regular rectangular shape in the matrix are effective in go.Surface plot:

Image

Solution suggestion:
Either modify the go.Surface or the go.Contour to make it possible to plot the 2D contour on any plane in a 3D figure.

Hope this issue can be solved together with [#5157] soon. Thanks!

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

Beginnen Sie mit der Untersuchung des go.Surface-Verhaltens bei NaN-maskierten surfacecolor-Werten und vergleichen Sie es mit dem go.Contour-Einstiegspunkt. Reproduzieren Sie das bereitgestellte Beispiel mit X, Y und Contour_Val und überprüfen Sie anschließend, dass outthrust-Werte auf der Ebene gerendert werden, ohne dass ein rechteckiger Bereich ohne NaN erforderlich ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

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

Neue Issues direkt in Ihr Postfach

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