Полностью анимированное обновление ребер между узлами в трехмерном сетевом графике - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь использовать заговор для анимации трехмерного сетевого графика, у которого есть ребра между узлами, которые добавляются с течением времени.

Я попробовал свою собственную базовую реализацию, следуя указаниям 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")

Идея состоит в том, что вы начинаете с облака точек, а затемсписок, который содержит списки цепочек ребер, сгруппированных по расстоянию, на которое они добавлены.(диапазон фильтрации - это диапазон, по которому он рассчитывается).Ребра индексируют в исходное облако точек.

Идея состоит в том, что для каждого значения в диапазоне фильтрации есть рамка, и все края группировки будут добавлены сразу.Сюжет начнется как облако точек и со временем будет построен.

Я планирую добавить ползунок, но сначала я пытаюсь заставить работать только разные кадры.

Спасибо за любую помощь.

...