在 python 中保存 3D NetworkX 图形,以便稍后使用 paraview 查看它
Save a 3D NetworkX graph in python to view it later with paraview
我在 python 中编写了使用 NetworkX 绘制随机 3D 图形的脚本。此脚本的输出是一个 3D 图形,我可以在其中围绕图形结构旋转相机。
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
但没有成功。
有没有在paraview中查看3D图形的方法?
NetworkX 和 Paraview 之间没有通用的数据类型。
通过将 vtk 导入您的 python 环境并使用 vtkLines 创建图形,您可以非常轻松地编写 VTK 文件(查看此示例:https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/ColoredLines/)
或者您可以从 NetworkX 导出到 JSON 并在 Paraview 中编写一个 Python 可编程源以读取自定义数据结构(参见这些示例 https://www.paraview.org/Wiki/Python_Programmable_Filter)
我在 python 中编写了使用 NetworkX 绘制随机 3D 图形的脚本。此脚本的输出是一个 3D 图形,我可以在其中围绕图形结构旋转相机。
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
但没有成功。
有没有在paraview中查看3D图形的方法?
NetworkX 和 Paraview 之间没有通用的数据类型。
通过将 vtk 导入您的 python 环境并使用 vtkLines 创建图形,您可以非常轻松地编写 VTK 文件(查看此示例:https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/ColoredLines/)
或者您可以从 NetworkX 导出到 JSON 并在 Paraview 中编写一个 Python 可编程源以读取自定义数据结构(参见这些示例 https://www.paraview.org/Wiki/Python_Programmable_Filter)