我正在尝试使用Plotly制作3D网络图的动画,该网络图的节点之间的边缘会随着时间的推移而增加。
我已经按照https://plot.ly/python/animations/的指南尝试了自己的基本实现。生成的绘图仅显示两帧,并且在加载后永久停留在一帧上,而播放按钮不起作用。
def wip_plot(point_cloud, filtrations, title, filepath, filtration_range):
figure = {
'data': [],
'layout': {},
'frames': []
}
figure['layout']['title'] = title
figure['layout']['hovermode'] = 'closest'
figure['layout']['updatemenus'] = [{
'buttons': [
{'args': [None, {'frame': {'duration': 500, 'redraw': True},
'fromcurrent': True, #'transition': {'duration': 300, 'easing': 'quadratic-in-out'}
}],
'label': 'Play',
'method': 'animate'}
],
'pad': {'r': 10, 't': 87},
'showactive': False,
'type': 'buttons'
}]
# make data trace
xn = point_cloud[:, 0]
yn = point_cloud[:, 1]
zn = point_cloud[:, 2]
colour_iter = cycle(kelly_colors)
# point trace always displayed.
point_trace = go.Scatter3d(x=xn,
y=yn,
z=zn,
mode='markers',
marker=dict(symbol='circle',
size=1,
color='black'),
name="Point cloud")
figure['data'].append(point_trace)
# make frames:
i = 1
frame_data = []
for filtration in filtrations:
frame = {'data': None, 'name': str(filtration_range[i])}
xe = []
ye = []
ze = []
insertion_values = []
for edge_chain in filtration:
# iterate over the indices in the edge chain
for v in edge_chain:
xe.append(point_cloud[v][0])
ye.append(point_cloud[v][1])
ze.append(point_cloud[v][2])
# add None to break the line.
xe.append(None)
ye.append(None)
ze.append(None)
insertion_values.append(str(simplex.data))
edge_trace = go.Scatter3d(x=xe,
y=ye,
z=ze,
mode='lines',
line=dict(color=next(colour_iter)),
text=insertion_values)
frame_data.append(edge_trace)
# add all data from previous frames.
frame['data'] = frame_data.copy()
figure['frames'].append(frame)
i += 1
plotly.offline.plot(figure, filename=filepath + title + ".html")
这个想法是从一个点云开始的,然后是一个列表,其中包含边缘链的列表,这些边缘链按添加的距离分组。 (过滤范围是计算得出的范围)。边索引到原始点云。
这个想法是在过滤范围内,每个值都有一个框架,并且分组的边缘将被一次性添加。该图将开始时只是点云,并会随着时间的推移逐渐建立。
我计划添加一个滑块,但我试图首先使不同的框架起作用。
感谢您的帮助。