地震层析成像的论文中很多采用Paraview来绘制三维速度模型。在此简单介绍一下如何将地震层析成像得到的速度模型用
Paraview绘制出来。
假设我们使用的层析成像代码不支持生成VTK文件,那么第一步就需要手动生成一个VTK文件。再次假定我们得到的层析成像
的结果的格式如下:
1
| longitude latitude depth vp
|
我们可以使用Python来生成VTK文件。这里主要参考 https://blog.xumijian.me/post/paraview-model/, 由于现在
PyVista的版本已经更新,因此原博文的代码直接运行会报错,这里针对新的版本进行了修订。
安装PyVista 和 netCDF4
1
2
| $ pip install pyvista
$ pip install netCDF4
|
我这里安装的版本如下:
1
2
| netCDF4 1.7.2
pyvista 0.45.2
|
生成vtk文件
写一个python程序,命名为convertToVtk.py
,具体内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import numpy as np
from scipy.interpolate import griddata
from scipy import ndimage
import scipy.signal as signal
import pyvista as pv
from netCDF4 import Dataset
#https://blog.xumijian.me/post/paraview-model/
class XYZ2VTK():
def __init__(self, lat1=21, lon1=97, lat2=34, lon2=108, maxdep=70):
self.lat1 = lat1
self.lat2 = lat2
self.lon1 = lon1
self.lon2 = lon2
self.lats = np.arange(lat1, lat2, 0.5)
self.lons = np.arange(lon1, lon2, 0.5)
self.dep = np.arange(-maxdep, 0, 5)
self.vp_file = 'vp.txt'
# self.moho_file = '../ccp3d/good_moho_ET2020_repick.dat'
# self.topo_file = '../figures/topo_resample.grd'
def read_xyz(self):
lon, lat, dep, vp = np.loadtxt(self.vp_file, unpack=True)
dep /= -1
new_lon, new_lat, new_dep = np.meshgrid(self.lons, self.lats, self.dep, indexing='ij')
grid_data = griddata((lon, lat, dep), vp, (new_lon, new_lat, new_dep))
return grid_data
def create_vtk(self):
grid = pv.ImageData()
grid_vp = self.read_xyz()
grid.dimensions = grid_vp.shape
grid.origin = (self.lon1, self.lat1, self.dep[0])
grid.spacing = (0.5, 0.5, 5)
grid.point_data["vp"] = grid_vp.flatten(order="F")
grid.save('vp.vtk')
if __name__ == "__main__":
converter = XYZ2VTK()
converter.create_vtk()
print("VTK file created successfully: vp.vtk")
|
我们从网上找一个川滇的公共速度模型简单测试一下
1
2
3
4
5
6
7
| # 下载速度模型
$ git clone https://github.com/liuyingustc/SWChinaCVM-1.0.git
$ cd SWChinaCVM-1.0
# 只取前4列数据
$ awk '{print $1,$2,$3,$4}' SWChinaCVMv1.0.txt > vp.txt
# 将其转换成vtk文件
$ python convertToVtk.py
|
在Paraview中画图
有了vtk文件后,在Paraview中画图用视频教程更容易上手,这里大家可以参考B站视频教程。这里我主要讲解一下如何调整一些参数,让画图更好看。
改变坐标轴的相对比例
如图1所示,首先在红框区域点击右键,选择open
可导入vtk文件,或者直接把vtk文件拖到红框区域也可以打开vtk文件。

图1显示的模型垂向上有点过长,因此需要设置一些参数使其看上去更美观一些。首先先找到图2中1标记的位置,打开齿轮
工具,然后
找到图2中2标记的scale,第三列对应的就是深度方向的scale,我这里将其调整为之前的0.1,可以看到对应右边的绿框中显示的深度
轴已经变成原来的十分之一了。但同时也带来了一个问题,就是对应的深度的坐标刻度也发生了变化。

接下来,首先找到图3中1标记的Axes Grid
点击Edit
,然后找到图3中2标记的齿轮
工具并点击它,接着找图3中3标记的Data scale
的第3列,同样,将其值调整为0.1,然后点击下面的Apply
, 你会发现速度模型图的深度坐标的刻度恢复正常了。这里我由于
已经点过了Apply
,所以图3中显示的是灰色的。

通过刚才的试验,可以发现只需将图2和图3的两个scale设置为相同的值,最后的模型图中的数值是和实际是一致的。
只绘制指定的几个刻度值
要改变坐标轴的刻度值,步骤和图3类似,主要步骤见图4。安装图中的顺序依次进行操作,其中前2步和图3一样,不再赘述。第三步,首先勾选Z Axis Use Custom Labels
,
然后,点击4处的+
,这里,我依次输入了-10,-30,-50,-70四个深度值。然后点击
5处的Apply
,可以看到图中只显示了4个刻度值。这里我由于
已经点过了Apply
,所以图4中显示的是灰色的。

参考资料