基于pyvista的三维矩阵数据显示
pyvista是对vtk的封装,使用更简单。下面是一个简单的测试,显示三维随机场数据,从文件读取三维矩阵数据,三维网格显示,以及三个方向的切片显示。
import numpy as np
import pyvista as pv
from argon2 import __main__
def createRegularMesh(values, origin, cellSize):
# 首先类似于新建一个空的矩阵
grid = pv.UniformGrid()
# 然后设置维度,如果想给cell填充数据则维度设置为 矩阵shape + 1,
# 如果是给point填充数据指定为矩阵shape
# 填充cell,颜色就不是渐变的,是每个块一个颜色,正好和ct的数据一样。
grid.dimensions = np.array(values.shape) + 1
# 设置origin和spacing,这两个参数正好和ct的参数一个意思。
grid.origin = origin # The bottom left corner of the data set
grid.spacing = cellSize # These are the cell sizes along each axis
# 设置(网格)矩阵的值
grid.cell_arrays["values"] = values.flatten(order="F") # Flatten the array!
return grid
def showRegularGrid3D(values, origin, cellSize):
gridMesh = createRegularMesh(values, origin, cellSize)
# plot
gridMesh.plot(show_edges=False)
def showRegularSlice3D(values, origin, cellSize, slicex, slicey, slicez):
#指定三维数据场,顶点坐标,网格尺寸,以及三个方向切片的坐标
gridMesh = createRegularMesh(values, origin, cellSize)
#指定x y z三个方向的坐标
slices = gridMesh.slice_orthogonal(x=slicex, y=slicey, z=slicez)
slices.plot()
def readArray3D(ni, nj, nk, fileName, headInfoNum):
#读取三维矩阵数据
#矩阵数据按行排列,从外向内,分别为k循环,j循环,和i循环。
dat=np.loadtxt(fileName, skiprows = headInfoNum)
print(dat.shape)
#设置矩阵维数
values = np.reshape(dat, (nk,nj,ni)).transpose(2,1,0)
return values
def test1():
_values = np.random.rand(10,10,5)
print(_values.shape)
_origin=(0,0,0)
_cellSize=(1,1,1)
showRegularGrid3D(_values,_origin, _cellSize)
def test2():
_fileName = R"./../../../CASE2/readTIArray_temp.ecl"
_ni = 100
_nj = 100
_nk = 20
_headInfoNum=1
_origin=(0,0,0)
_cellSize=(10,10,5)
_values = readArray3D(_ni, _nj, _nk, _fileName, _headInfoNum)
print(_values.shape)
showRegularGrid3D(_values,_origin, _cellSize)
def test3():
_fileName = R"./../../../CASE2/readTIArray_temp.ecl"
_ni = 100
_nj = 100
_nk = 20
_headInfoNum=1
_origin=(0,0,0)
_cellSize=(10,10,5)
_values = readArray3D(_ni, _nj, _nk, _fileName, _headInfoNum)
print(_values.shape)
_slicex=_ni*_cellSize[0]
_slicey=1*_cellSize[1]
_slicez=_nk*_cellSize[2]
showRegularSlice3D(_values,_origin, _cellSize, _slicex, _slicey, _slicez)
if __name__== "__main__":
#test1()
#test2()
test3()
产生随机数三维矩阵,test1()
读取三维矩阵数据并显示,test2(),其中矩阵数据按行排列,从外向内,分别为k循环,j循环,和i循环。
切片显示方式
参考资料
https://blog.csdn.net/u012925804/article/details/105292081