我已经获得了一部分势能面的数值数据,为此我使用了双三次插值,如本Wikipedia page中所述。现在,我想绘制我得到的表面,可能以某种方式使颜色表示函数的值(某种程度的热图)。
我有(m x m)点和(m-1)x(m-1)个函数的常规混搭。我有x,y值(在Wikipedia表示法中为p(0,0))和函数系数存储在名为coefficients_ci.txt的文件中。
这是我的尝试。我得到某种surface,但不仅仅是表面-xy平面(z = 0时)和我的表面之间的空间充满了颜色。
这是我的代码:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
with open ('coefficients_ci.txt', 'r') as all_data:
lines3 = np.array([line.split() for line in all_data])
all_input_data3 = lines3.astype(float)
def fun(u, v, method, i):
a00 = all_input_data3[i,3]
a10 = all_input_data3[i,4]
a20 = all_input_data3[i,5]
a30 = all_input_data3[i,6]
a01 = all_input_data3[i,7]
a11 = all_input_data3[i,8]
a21 = all_input_data3[i,9]
a31 = all_input_data3[i,10]
a02 = all_input_data3[i,11]
a12 = all_input_data3[i,12]
a22 = all_input_data3[i,13]
a32 = all_input_data3[i,14]
a03 = all_input_data3[i,15]
a13 = all_input_data3[i,16]
a23 = all_input_data3[i,17]
a33 = all_input_data3[i,18]
x0 = all_input_data3[i, 1]
y0 = all_input_data3[i, 2]
# transform coordinates so that starting point is 0,0
x = (u-x0)*100
y = (v-y0)*100
return a00 + a01*y + a02*y**2 + a03*y**3\
+ a10*x + a11*x*y + a12*x*y**2 + a13*x*y**3\
+ a20*x**2 + a21*x**2*y + a22*x**2*y**2 + a23*x**2*y**3\
+ a30*x**3 + a31*x**3*y + a32*x**3*y**2 + a33*x**3*y**3
def plotData(method):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(0, len(all_input_data3)):
print(i)
u = np.arange(all_input_data3[i, 1], all_input_data3[i, 1]+0.01, 0.0001)
v = np.arange(all_input_data3[i, 2], all_input_data3[i, 2]+0.01, 0.0001)
X, Y = np.meshgrid(u, v)
zs = np.array([fun(u,v, method, i) for u,v in zip(np.ravel(X), np.ravel(Y))])
print('Calculated function values')
Z = zs.reshape(X.shape)
ax.plot_surface(X, Y, Z)
continue
# plt.show()
plt.savefig('plot_%s.pdf' % method)
return
希望我的问题描述得足够清楚,并且有人能够帮助我。