Я пытаюсь использовать заговор для анимации трехмерного сетевого графика, у которого есть ребра между узлами, которые добавляются с течением времени.
Я попробовал свою собственную базовую реализацию, следуя указаниям 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")
Идея состоит в том, что вы начинаете с облака точек, а затемсписок, который содержит списки цепочек ребер, сгруппированных по расстоянию, на которое они добавлены.(диапазон фильтрации - это диапазон, по которому он рассчитывается).Ребра индексируют в исходное облако точек.
Идея состоит в том, что для каждого значения в диапазоне фильтрации есть рамка, и все края группировки будут добавлены сразу.Сюжет начнется как облако точек и со временем будет построен.
Я планирую добавить ползунок, но сначала я пытаюсь заставить работать только разные кадры.
Спасибо за любую помощь.