【问题标题】:Cones color problems with PlotlyPlotly 的锥体颜色问题
【发布时间】:2020-10-02 15:59:47
【问题描述】:

我在使用 Plotly 绘制圆锥时遇到了一个小问题。在我的数据中,范数 1 和 1.5 有两种类型的向量。当我在一个立方体上仅绘制 8 个时,颜色渲染得非常好,每种类型的矢量都有两种颜色中的一种。但是,例如,一旦我用 2 个立方体变大,它就会变得非常随机。这是重现此问题的最小示例。

数据:

import numpy as np
import pandas as pd
import plotly.graph_objects as go

pos=pd.DataFrame([
      [0.0,0.0,0.0],
      [0.5,0.0,0.0],
      [0.0, 0.5,0.0],
      [0.5,0.5,0.0],
      [0.0,0.0,0.5],
      [0.5,0.0,0.5],
      [0.0,0.5,0.5],
      [0.5,0.5,0.5]
      ], columns=['x','y','z'])
pos2=pd.DataFrame([
      [0.0,0.0,0.0],
      [0.5,0.0,0.0],
      [0.0, 0.5,0.0],
      [0.5,0.5,0.0],
      [0.0,0.0,0.5],
      [0.5,0.0,0.5],
      [0.0,0.5,0.5],
      [0.5,0.5,0.5],
      [1.0,0.0,0.0],
      [1.5,0.0,0.0],
      [1.0, 0.5,0.0],
      [1.5,0.5,0.0],
      [1.0,0.0,0.5],
      [1.5,0.0,0.5],
      [1.0,0.5,0.5],
      [1.5,0.5,0.5]
      ], columns=['x','y','z'])
type = pd.DataFrame(np.array([[1],[1.5],[1],[1.5],[1],[1.5],[1],[1.5],[1],[1.5],[1],[1.5],[1],[1.5],[1],[1.5]]), columns=['Type'])
vec = pd.DataFrame(np.array([[ 0.56493151,  0.58643612, -0.5804697 ],
       [ 0.52637789, -0.81556709, -0.24036772],
       [-0.64603163, -0.4828808 ,  0.59115925],
       [-0.42559098,  0.83496509,  0.34886332],
       [ 0.16788166,  0.63197593,  0.75658587],
       [ 0.8961372 , -0.20426566,  0.39397165],
       [-0.08599516, -0.68074558, -0.72745467],
       [-0.90366508,  0.25896575, -0.34106622],
       [ 0.68002417,  0.47929612, -0.55483543],
       [ 0.2721998 ,  0.70224966, -0.65783941],
       [-0.68464335, -0.51281615,  0.5179605 ],
       [-0.35330142, -0.53106658,  0.77015998],
       [-0.46760187,  0.29858559,  0.83198265],
       [ 0.68459979, -0.50165276,  0.52883612],
       [ 0.44722097, -0.32492581, -0.83331664],
       [-0.55474541,  0.49785322, -0.66663311]]), columns=['x','y','z'])

绘制 1 个立方体:

layout = go.Layout(
         title='Cones',
         width=700,
         height=700
        )

fig = go.Figure(data = go.Cone(
    x=pos['x'],
    y=pos['y'],
    z=pos['z'],
    u=type['Type']*vec['x'],
    v=type['Type']*vec['y'],
    w=type['Type']*vec['z'],
    colorscale='viridis',
    colorbar=dict(thickness=20, ticklen=4),
    sizemode="absolute",
    sizeref=0.5,
    anchor='tail'
), layout=layout)

fig

该图显示了 8 个向量的正确颜色。

绘制 2 个立方体:

layout = go.Layout(
         title='Cones',
         width=700,
         height=700
        )

fig = go.Figure(data = go.Cone(
    x=pos.append(pos+[1,0,0], ignore_index=True)['x'],
    y=pos.append(pos+[1,0,0], ignore_index=True)['y'],
    z=pos.append(pos+[1,0,0], ignore_index=True)['z'],
    u=type['Type']*vec['x'],
    v=type['Type']*vec['y'],
    w=type['Type']*vec['z'],
    colorscale='viridis',
    colorbar=dict(thickness=20, ticklen=4),
    sizemode="absolute",
    sizeref=0.5,
    anchor='tail'
), layout=layout)

fig

正如您在最后一张图片中看到的那样,范数 1 的所有向量都是深紫色,而范数 1.5 的向量采用颜色渐变,其中一些甚至是深紫色,如显示其坐标的锥体所示。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你运行的是哪个 plotly 版本?

标签: python plotly


【解决方案1】:

这可能不是一个有用的答案,但我能得出的最好结论是你偶然发现了一个错误。我刚刚更新到最新版本(plotly 4.11.0),我得到了相同的结果。

如果你为u,v,w 传入一个常量,它会正确呈现:

# using pos df from above
vect=pd.DataFrame(np.full((16, 3), 0.866),columns=['u','v','w'])

fig = go.Figure(data = go.Cone(
                    x=pos.append(pos+[1,0,0], ignore_index=True)['x'],
                    y=pos.append(pos+[1,0,0], ignore_index=True)['y'],
                    z=pos.append(pos+[1,0,0], ignore_index=True)['z'],
                    u=vect['u'],
                    v=vect['v'],
                    w=vect['w'],
                ))

fig.show()

然后我在想可能是数据没有对齐(输入 df 的大小并不总是相同,也没有使用旁注 pos2)...但是,即使您的数据被提取并放入 @987654330 @我得到了类似的结果:

x,      y,      z,      u,          v,          w
0,      0,      0,      0.564932,   0.586436,   -0.58047
0.5,    0,      0,      0.789567,   -1.223351,  -0.360552
0,      0.5,    0,      -0.646032,  -0.482881,  0.591159
0.5,    0.5,    0,      -0.638386,  1.252448,   0.523295
0,      0,      0.5,    0.167882,   0.631976,   0.756586
0.5,    0,      0.5,    1.344206,   -0.306398,  0.590957
0,      0.5,    0.5,    -0.085995,  -0.680746,  -0.727455
0.5,    0.5,    0.5,    -1.355498,  0.388449,   -0.511599
1,      0,      0,      0.680024,   0.479296,   -0.554835
1.5,    0,      0,      0.4083,     1.053374,   -0.986759
1,      0.5,    0,      -0.684643,  -0.512816,  0.517961
1.5,    0.5,    0,      -0.529952,  -0.7966,    1.15524
1,      0,      0.5,    -0.467602,  0.298586,   0.831983
1.5,    0,      0.5,    1.0269,     -0.752479,  0.793254
1,      0.5,    0.5,    0.447221,   -0.324926,  -0.833317
1.5,    0.5,    0.5,    -0.832118,  0.74678,    -0.99995
df= pd.read_csv("vortexTest.csv")

fig2 = go.Figure(data = go.Cone(
    x=df['x'], y=df['y'], z=df['z'],
    u=df['u'], v=df['v'], w=df['w'],
    cmax=1.5,
    cmin=1
))

fig2.show()

看起来norm 的计算正确,但不知何故颜色应用不正确。正如您所指出的,这里应该只有两种颜色,黄色代表 1.5,蓝色代表 1.0。

【讨论】:

  • 由于似乎是一个bug,我会在GitHub上联系Plotly,让他们知道。目前对我有用的一件事是使用更大的系统。在 y 方向添加另一个立方体可以解决问题。
猜你喜欢
  • 2020-10-23
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2014-02-19
  • 2020-03-22
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多