假设你有两个txt文件,分别是data-z600.txt和data-z1200.txt,和你的python脚本在同一个文件夹下,其内容完全一致
data-z600.txt(你的)
XA YA ZA GA
200 0 600 1.27
600 0 600 1.54
1200 0 600 1.49
1800 0 600 1.34
2400 0 600 1.27
3000 0 600 1.25
200 600 600 1.28
600 600 600 1.96
1200 600 600 1.12
1800 600 600 1.06
2400 600 600 1.06
3000 600 600 1.06
和data-z1200.txt(故意发明的)
XA YA ZA GA
200 0 1200 1.31
600 0 1200 2
1200 0 1200 1.63
1800 0 1200 1.36
2400 0 1200 1.31
3000 0 1200 1.35
200 600 1200 1.38
600 600 1200 1.36
1200 600 1200 1.2
1800 600 1200 1.1
2400 600 1200 1.1
3000 600 1200 1.11
让我们导入所有需要的库
# libraries
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import scipy.interpolate as si
from matplotlib import cm
import pandas as pd
import numpy as np
并定义grids_maker,该函数负责准备给定文件中包含的数据,这里通过 filepath 参数。
def grids_maker(filepath):
# Get the data
df = pd.read_csv(filepath, sep=' ')
# Make things more legible
xy = df[['XA', 'YA']]
x = xy.XA
y = xy.YA
z = df.ZA
g = df.GA
reso_x = reso_y = 50
interp = 'cubic' # or 'nearest' or 'linear'
# Convert the 4d-space's dimensions into grids
grid_x, grid_y = np.mgrid[
x.min():x.max():1j*reso_x,
y.min():y.max():1j*reso_y
]
grid_z = si.griddata(
xy, z.values,
(grid_x, grid_y),
method=interp
)
grid_g = si.griddata(
xy, g.values,
(grid_x, grid_y),
method=interp
)
return {
'x' : grid_x,
'y' : grid_y,
'z' : grid_z,
'g' : grid_g,
}
让我们在文件列表上使用grids_maker 并获取每个文件第 4 维的极值。
# Let's retrieve all files' contents
fgrids = dict.fromkeys([
'data-z600.txt',
'data-z1200.txt'
])
g_mins = []
g_maxs = []
for fpath in fgrids.keys():
fgrids[fpath] = grids = grids_maker(fpath)
g_mins.append(grids['g'].min())
g_maxs.append(grids['g'].max())
让我们创建我们的(所有文件统一)色标
# Create the 4th color-rendered dimension
scam = plt.cm.ScalarMappable(
norm=cm.colors.Normalize(min(g_mins), max(g_maxs)),
cmap='jet' # see https://matplotlib.org/examples/color/colormaps_reference.html
)
...最后制作/显示情节
# Make the plot
fig = plt.figure()
ax = fig.gca(projection='3d')
for grids in fgrids.values():
scam.set_array([])
ax.plot_surface(
grids['x'], grids['y'], grids['z'],
facecolors = scam.to_rgba(grids['g']),
antialiased = True,
rstride=1, cstride=1, alpha=None
)
plt.show()