VTK a Matplotlib utilizando Numpy

Quiero extraer algunos datos (por ejemplo, escalares) de un archivo VTK junto con sus coordenadas en la cuadrícula y luego procesarlos en Matplotlib . El problema es que no sé cómo capturar los datos de punto / celda del archivo VTK (por ejemplo, dándoles el nombre del escalar) y cargarlos en una matriz numpy usando vtk_to_numpy

Mi código debería verse como:

import matplotlib.pyplot as plt from scipy.interpolate import griddata import numpy as np from vtk import * from vtk.util.numpy_support import vtk_to_numpy # load input data reader = vtk.vtkXMLUnstructuredGridReader() reader.SetFileName("my_input_data.vtk") reader.Update() (...missing steps) # VTK to Numpy my_numpy_array = vtk_to_numpy(...arguments ?) #Numpy to Matplotlib (after converting my_numpy_array to x,y and z) CS = plt.contour(x,y,z,NbLevels) ... 

PD: Sé que Paraview podría hacer la tarea, pero estoy intentando procesar algunos datos sin tener que abrir Paraview. Cualquier ayuda es apreciada

Editar 1

Considero que este tutorial en pdf es muy útil para aprender los conceptos básicos del manejo de archivos VTK

No sé cómo se ve tu conjunto de datos, así que aquí hay solo un método para obtener las ubicaciones de los puntos y los valores de los escalares:

 from vtk import * from vtk.util.numpy_support import vtk_to_numpy # load input data reader = vtk.vtkGenericDataObjectReader() reader.SetFileName(r"C:\Python27\VTKData\Data\uGridEx.vtk") reader.Update() ug = reader.GetOutput() points = ug.GetPoints() print vtk_to_numpy(points.GetData()) print vtk_to_numpy(ug.GetPointData().GetScalars()) 

Será un poco fácil si puedes usar tvtk :

 from tvtk.api import tvtk reader = tvtk.GenericDataObjectReader() reader.file_name = r"C:\Python27\VTKData\Data\uGridEx.vtk" reader.update() ug = reader.output print ug.points.data.to_array() print ug.point_data.scalars.to_array() 

Si desea hacer un trazado de contour en matplotib, creo que necesita una cuadrícula, es posible que necesite usar alguna clase VTK para convertir el conjunto de datos en una cuadrícula, como vtkProbeFilter .

Finalmente encontré una forma (tal vez no la óptima) que hace el trabajo. El ejemplo aquí es el trazado de contornos de un campo de temperatura extraído de un archivo vtk:

 import matplotlib.pyplot as plt import matplotlib.cm as cm from scipy.interpolate import griddata import numpy as np import vtk from vtk.util.numpy_support import vtk_to_numpy # load a vtk file as input reader = vtk.vtkXMLUnstructuredGridReader() reader.SetFileName("my_input_data.vtk") reader.Update() # Get the coordinates of nodes in the mesh nodes_vtk_array= reader.GetOutput().GetPoints().GetData() #The "Temperature" field is the third scalar in my vtk file temperature_vtk_array = reader.GetOutput().GetPointData().GetArray(3) #Get the coordinates of the nodes and their temperatures nodes_nummpy_array = vtk_to_numpy(nodes_vtk_array) x,y,z= nodes_nummpy_array[:,0] , nodes_nummpy_array[:,1] , nodes_nummpy_array[:,2] temperature_numpy_array = vtk_to_numpy(temperature_vtk_array) T = temperature_numpy_array #Draw contours npts = 100 xmin, xmax = min(x), max(x) ymin, ymax = min(y), max(y) # define grid xi = np.linspace(xmin, xmax, npts) yi = np.linspace(ymin, ymax, npts) # grid the data Ti = griddata((x, y), T, (xi[None,:], yi[:,None]), method='cubic') ## CONTOUR: draws the boundaries of the isosurfaces CS = plt.contour(xi,yi,Ti,10,linewidths=3,cmap=cm.jet) ## CONTOUR ANNOTATION: puts a value label plt.clabel(CS, inline=1,inline_spacing= 3, fontsize=12, colors='k', use_clabeltext=1) plt.colorbar() plt.show() 

introduzca la descripción de la imagen aquí