绘制动画更新3D网络图中节点之间的边缘

时间:2019-07-11 14:14:58

标签: python animation graph plotly plotly-python

我正在尝试使用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")

这个想法是从一个点云开始的,然后是一个列表,其中包含边缘链的列表,这些边缘链按添加的距离分组。 (过滤范围是计算得出的范围)。边索引到原始点云。

这个想法是在过滤范围内,每个值都有一个框架,并且分组的边缘将被一次性添加。该图将开始时只是点云,并会随着时间的推移逐渐建立。

我计划添加一个滑块,但我试图首先使不同的框架起作用。

感谢您的帮助。

0 个答案:

没有答案