在plotly python中对trisurf使用可见性滑块

2024-07-07 05:40:58 发布

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

我想在python中使用plotly来绘制圆环体,然后使用滑块沿圆环体移动对象。到目前为止,我能够一次显示所有的对象,或者只是滑动以查看没有圆环体的各个切片。这两种情况之间最大的区别是如何将信息传递给plotly.plot:在第一种情况下,我扩展了一个trisurf对象,而在第二种情况下,我附加了一个python list。我希望圆环始终可见,然后随着滑块的移动,不同的圆将出现/消失。我很抱歉,如果我错过了一些阴谋文件。你知道吗

一次完成所有事情

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)

Tags: importgodataplotasnpsincos
1条回答
网友
1楼 · 发布于 2024-07-07 05:40:58

答案可以在here on the plotly forum找到。总之,不能直接将trisurf传递给plot,因为它包含自己的layout键。因此,您需要从trisurf中剥离数据,然后传递它。在上面的“无圆环滑块”代码中,行

plot_data.append(torus)` 

应替换为

plot_data.append(torus.data[0])
plot_data.append(torus.data[1])

然后它就会按预期工作。你知道吗

相关问题 更多 >