plotly / plotly/plotly.py

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

オープン
#5,229 コメント 6 件 リアクション 2 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug P1
主要言語
Python
スター
18.8k
フォーク
2.8k
平均マージ
16時間 26分
マージ済み PR(30日)
21

説明

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!

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

まず、NaN でマスクされた surfacecolor 値に対する go.Surface の動作を調べ、go.Contour のエントリーポイントと比較します。提示された X、Y、Contour_Val の例を再現し、その後、矩形の非 NaN 領域を必要とせずに outthrust 値が平面上にレンダリングされることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
data-visualization
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。