Сохраните график 3D NetworkX в python, чтобы просмотреть его позже с помощью paraview

Я написал этот скрипт, который рисует случайный трехмерный график, используя NetworkX в python. Результатом этого скрипта является трехмерная фигура, в которой я могу вращать камеру вокруг структуры графика.

import networkx as nx
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import random
import pickle


def gen_random_3d_graph(n_nodes, radius):
    pos = {i: (random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)) for i in range(n_nodes)}
    graph = nx.random_geometric_graph(n_nodes, radius, pos=pos)
    return graph


def plot_3d_network(graph, angle):
    pos = nx.get_node_attributes(graph, 'pos')

    with plt.style.context("bmh"):
        fig = plt.figure(figsize=(10, 7))
        ax = Axes3D(fig)
        for key, value in pos.items():
            xi = value[0]
            yi = value[1]
            zi = value[2]

            ax.scatter(xi, yi, zi, edgecolor='b', alpha=0.9)
            for i, j in enumerate(graph.edges()):
                x = np.array((pos[j[0]][0], pos[j[1]][0]))
                y = np.array((pos[j[0]][1], pos[j[1]][1]))
                z = np.array((pos[j[0]][2], pos[j[1]][2]))
                ax.plot(x, y, z, c='black', alpha=0.9)
    ax.view_init(30, angle)
    pickle.dump(fig, open('FigureObject.fig.pickle', 'wb'))
    plt.show()


if __name__ == '__main__':

    graph01 = gen_random_3d_graph(15, 0.6)
    plot_3d_network(graph01, 0)

Я хочу сохранить этот график, чтобы просмотреть его позже, используя paraview. Я пробовал pickle, но это не сработало. Можно ли как-то просмотреть 3D-график в paraview?


person shahriar    schedule 10.01.2019    source источник


Ответы (1)


Между NetworkX и Paraview нет общего типа данных.

Вы можете очень легко написать файл VTK, импортировав vtk в свою среду Python и создав график с помощью vtkLines (посмотрите этот пример: https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/ColoredLines/)

Или вы можете экспортировать из NetworkX в JSON и написать Python Programmable Source в Paraview для чтения пользовательской структуры данных (см. эти примеры https://www.paraview.org/Wiki/Python_Programmable_Filter)

person Stuart Buckingham    schedule 14.01.2019
comment
Спасибо, моей целью было преобразовать ребра графа в цилиндры соответствующей ширины в 3-х измерениях. Как вы предполагаете, я думаю, что vtk больше подходит для этой проблемы, чем NetworkX. - person shahriar; 15.01.2019