问题描述
我想使用python可视化VTK数据文件(OpenFOAM输出).我要绘制的图是两个端点之间的数量的1-d线图.为此,应在两个端点之间的点上插值非结构化数据.
I would like to visualise a VTK data file (OpenFOAM output) using python. The plot I would like to make is a 1-d line plot of a quantity between two endpoints. To do so, the unstructured data should be interpolated on the points which lie between the two endpoints.
我使用了Mayavi软件包来可视化VTK数据.在 mayavi网页中,描述了从标量场.此功能不适用于VTK文件.
I've used the package Mayavi to visualise the VTK data. At the mayavi webpage there is a description of probing a single value from a scalarfield. This function does not work on a VTK file.
我还在 mayavi上找到了delaunay3d方法(mlab.pipeline.delaunay3d)网页.我也没有让这个工作.
Also I've found a delaunay3d method (mlab.pipeline.delaunay3d) at the mayavi webpage. I did not get this one to work either.
有人可以建议我如何插入我的数据吗?
Could anyone advise me how to interpolate my data?
推荐答案
最终,我找到了自己问题的答案.以防万一有人访问这个主题并遇到相同的问题,我将发布我的解决方案.我已经使用vtkProbeFilter插值了我的VTK数据.插值后,为了绘制方便,我将VTK线转换为numpy数组.
Eventually, I found the answer to my own question. Just in case anyone visits this topic ans has the same problems, I will post my solution. I've used the vtkProbeFilter to interpolate my VTK-data. After the interpolation I've transformed the VTK-line to a numpy array for plotting convenience.
#!/usr/bin/env python
import numpy as np
from vtk.util import numpy_support as VN
from matplotlib import pyplot as plt
import vtk
def readVTK(filename):
#read the vtk file with an unstructured grid
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(filename)
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()
return reader
def createLine(p1,p2,numPoints):
# Create the line along which you want to sample
line = vtk.vtkLineSource()
line.SetResolution(numPoints)
line.SetPoint1(p1)
line.SetPoint2(p2)
line.Update()
return line
def probeOverLine(line,reader):
#Interpolate the data from the VTK-file on the created line.
data = reader.GetOutput()
# vtkProbeFilter, the probe line is the input, and the underlying dataset is the source.
probe = vtk.vtkProbeFilter()
probe.SetInputConnection(line.GetOutputPort())
probe.SetSource(data)
probe.Update()
#get the data from the VTK-object (probe) to an numpy array
q=VN.vtk_to_numpy(probe.GetOutput().GetPointData().GetArray('U'))
numPoints = probe.GetOutput().GetNumberOfPoints() # get the number of points on the line
#intialise the points on the line
x = np.zeros(numPoints)
y = np.zeros(numPoints)
z = np.zeros(numPoints)
points = np.zeros((numPoints , 3))
#get the coordinates of the points on the line
for i in range(numPoints):
x[i],y[i],z[i] = probe.GetOutput().GetPoint(i)
points[i,0]=x[i]
points[i,1]=y[i]
points[i,2]=z[i]
return points,q
def setZeroToNaN(array):
# In case zero-values in the data, these are set to NaN.
array[array==0]=np.nan
return array
#Define the filename of VTK file
filename='a-VTK-file.vtk'
#Set the points between which the line is constructed.
p1=[0.0,-0.1,0.0]
p2=[0.0,-0.1,1.0]
#Define the numer of interpolation points
numPoints=100
reader = readVTK(filename) # read the VTKfile
line=createLine(p1,p2,numPoints) # Create the line
points,U = probeOverLine(line,reader) # interpolate the data over the line
U = setZeroToNaN(U) # Set the zero's to NaN's
plt.plot(points[:,2],U[:,0]) #plot the data
plt.show()
这篇关于使用python TVTK或MayaVi探测/采样/插值VTK数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!