在plotly python中使用带trisurf的可见性滑块
我想在python中使用plotly绘制圆环,然后使用滑块沿圆环移动对象。到目前为止,我能够一次显示所有对象,或者只需滑动以查看没有圆环体的各个切片。这两种情况之间最大的区别是如何将信息以plotly.plot方式传递到在plotly python中使用带trisurf的可见性滑块,python,slider,plotly,Python,Slider,Plotly,我想在python中使用plotly绘制圆环,然后使用滑块沿圆环移动对象。到目前为止,我能够一次显示所有对象,或者只需滑动以查看没有圆环体的各个切片。这两种情况之间最大的区别是如何将信息以plotly.plot方式传递到trisurf:在第一种情况下,我扩展了trisurf对象,而在第二种情况下,我添加到python列表中。我希望圆环始终可见,然后随着滑块的移动,不同的圆将出现/消失。如果我遗漏了详细文档中的某些内容,我向您道歉 一次完成所有任务 import plotly import plo
trisurf
:在第一种情况下,我扩展了trisurf
对象,而在第二种情况下,我添加到python列表中。我希望圆环始终可见,然后随着滑块的移动,不同的圆将出现/消失。如果我遗漏了详细文档中的某些内容,我向您道歉
一次完成所有任务
import plotly
import plotly.figure_factory as FF
import plotly.graph_objs as go
import numpy as np
from scipy.spatial import Delaunay
## Draw torus
u = np.linspace(0, 2*np.pi, 15)
v = np.linspace(0, 2*np.pi, 15)
U,V = np.meshgrid(u,v)
u = U.flatten()
v = V.flatten()
x = (3 + (np.cos(v)))*np.cos(u)
y = (3 + (np.cos(v)))*np.sin(u)
z = np.sin(v)
X = (3 + (np.cos(V)))*np.cos(U)
Y = (3 + (np.cos(V)))*np.sin(U)
Z = np.sin(V)
points2D = np.vstack([u,v]).T
tri = Delaunay(points2D)
simplices = tri.simplices
torus = FF.create_trisurf(x=x, y=y, z=z, simplices=simplices, title="Torus", aspectratio=dict(x=1, y=1, z=0.3),plot_edges=True, width=1000)
for i in range(10,13):
trace0 = go.Scatter3d(
x = (3+np.cos(v))*np.cos(u[i]),
y = (3+np.cos(v))*np.sin(u[i]),
z = np.sin(v),
marker=dict(
size=1,
color='red',
),
line=dict(
color='red',
width=4,
),
)
torus['data'].extend(go.Data([trace0]))
fig=dict(data=torus)
plotly.offline.plot(fig,validate=False)
不带圆环的滑块
import plotly
import plotly.figure_factory as FF
import plotly.graph_objs as go
import numpy as np
from scipy.spatial import Delaunay
## Draw torus
u = np.linspace(0, 2*np.pi, 15)
v = np.linspace(0, 2*np.pi, 15)
U,V = np.meshgrid(u,v)
u = U.flatten()
v = V.flatten()
x = (3 + (np.cos(v)))*np.cos(u)
y = (3 + (np.cos(v)))*np.sin(u)
z = np.sin(v)
X = (3 + (np.cos(V)))*np.cos(U)
Y = (3 + (np.cos(V)))*np.sin(U)
Z = np.sin(V)
points2D = np.vstack([u,v]).T
tri = Delaunay(points2D)
simplices = tri.simplices
plot_data=list()
torus = FF.create_trisurf(x=x, y=y, z=z, simplices=simplices, title="Torus", aspectratio=dict(x=1, y=1, z=0.3),plot_edges=True, width=1000)
plot_data.append(torus)
for i in range(10,13):
trace0 = go.Scatter3d(
x = (3+np.cos(v))*np.cos(u[i]),
y = (3+np.cos(v))*np.sin(u[i]),
z = np.sin(v),
marker=dict(
size=1,
color='red',
),
line=dict(
color='red',
width=4,
),
)
plot_data.append(trace0)
steps = list()
for i in range(4):
step = dict(
method='restyle',
args=['visible', [False] * (4)],
label='Time Step {}'.format(i)
)
step['args'][1][i] = True
steps.append(step)
sliders = [dict(steps=steps)]
layout=dict(sliders=sliders)
fig=dict(data=plot_data,layout=layout)
plotly.offline.plot(fig,validate=False)
答案是可以找到的。总之,您不能直接将trisurf
传递到plot
,因为它包含自己的布局
键。因此,您需要从trisurf中剥离数据,然后传递该数据。在上面的“无圆环滑块”代码中,行
plot_data.append(torus)`
应替换为
plot_data.append(torus.data[0])
plot_data.append(torus.data[1])
然后它将按预期工作