Plotly:如何将两个3D图形与Plotly.graph\u对象放在同一个绘图上?

2024-03-28 12:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我用plotly.graph_objects绘制了两个3D图形。我无法把它们组合在一起

import plotly.graph_objects as go
import numpy as np

pts = np.loadtxt(np.DataSource().open('https://raw.githubusercontent.com/plotly/datasets/master/mesh_dataset.txt'))
x, y, z = pts.T

### First graph
fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z,
                   alphahull=5,
                   opacity=0.4,
                   color='cyan')])
fig.show()
#######

x = [0, 1, 0]
y = [0, 2, 3]
tvects = [x,y]
orig = [0,0,0]
df=[]
coords = [[orig, np.sum([orig, v],axis=0)] for v in tvects]

for i,c in enumerate(coords):
    X1, Y1, Z1 = zip(c[0])
    X2, Y2, Z2 = zip(c[1])
    vector = go.Scatter3d(x = [X1[0],X2[0]],
                          y = [Y1[0],Y2[0]],
                          z = [Z1[0],Z2[0]],
                          marker = dict(size = [0,5],
                                        color = ['blue'],
                                        line=dict(width=5,
                                                  color='DarkSlateGrey')),
                          name = 'Vector'+str(i+1))
    data.append(vector)

### Second graph
fig = go.Figure(data=data)
fig.show()
########

请你详细说明一下怎么做,以及如何在第二张图中用箭头代替直线


Tags: importgodataobjectsasshownpfig
1条回答
网友
1楼 · 发布于 2024-03-28 12:15:35

如果您想在第一个fig定义的基础上进行构建,只需在第一次调用go.Figure()之后包含以下内容

data = fig._data

data现在是一个列表,它将在您已经存在的代码的其余部分中添加新元素,如下所示:

for i,c in enumerate(coords):
    X1, Y1, Z1 = zip(c[0])
    X2, Y2, Z2 = zip(c[1])
    vector = go.Scatter3d(<see details in snippet below>)
    data.append(vector)

结果:

enter image description here

关于箭头,您通过go.Scatter3D直接可用的唯一选项是:

['circle', 'circle-open', 'square', 'square-open','diamond', 'diamond-open', 'cross', 'x']

我希望其中一个选择能满足你的需要。您可以指定以下选项中的哪一个:

marker = dict(size = [15,15],
            color = ['blue'],
            symbol = 'diamond',
            line=dict(width=500,
                      #color='red'
                     )),

完整代码:

import plotly.graph_objects as go
import numpy as np

pts = np.loadtxt(np.DataSource().open('https://raw.githubusercontent.com/plotly/datasets/master/mesh_dataset.txt'))
x, y, z = pts.T

### First graph
fig = go.Figure(data=[go.Mesh3d(x=x, y=y, z=z,
                   alphahull=5,
                   opacity=0.4,
                   color='cyan')])
#fig.show()
#######

data = fig._data

x = [0, 1, 0]
y = [0, 2, 3]
tvects = [x,y]
orig = [0,0,0]
df=[]
coords = [[orig, np.sum([orig, v],axis=0)] for v in tvects]

# ['circle', 'circle-open', 'square', 'square-open','diamond', 'diamond-open', 'cross', 'x']

for i,c in enumerate(coords):
    X1, Y1, Z1 = zip(c[0])
    X2, Y2, Z2 = zip(c[1])
    vector = go.Scatter3d(x = [X1[0],X2[0]],
                          y = [Y1[0],Y2[0]],
                          z = [Z1[0],Z2[0]],
                          marker = dict(size = [15,15],
                                        color = ['blue'],
                                        symbol = 'diamond',
                                        line=dict(width=500,
                                                  #color='red'
                                                 )),
                          name = 'Vector'+str(i+1))
    data.append(vector)

### Second graph
fig = go.Figure(data=data)
fig.show()
########

相关问题 更多 >