Reputation: 48
I have a 4x4 matrix (test4x4
) which I want to interpolate it to a 8x8 matrix (test8x8
). I used interpolate.interp2d
for interpolation, but when I plot it (test8x8
), it does not seem like test4x4
plot. Where do I mistake?
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mymin,mymax = 0,3
X = np.linspace(mymin,mymax,4)
Y = np.linspace(mymin,mymax,4)
x,y = np.meshgrid(X,Y)
test4x4 = np.array([[ 1.2514318 , 1.25145821, 1.25148472, 1.25151133],
[ 1.25087456, 1.25090105, 1.25092764, 1.25095435],
[ 1.25031581, 1.25034238, 1.25036907, 1.25039586],
[ 1.24975557, 1.24978222, 1.24980898, 1.24983587]])
f = interpolate.interp2d(x,y,test4x4,kind='cubic')
# use linspace so your new range also goes from 0 to 3, with 8 intervals
Xnew = np.linspace(mymin,mymax,8)
Ynew = np.linspace(mymin,mymax,8)
test8x8 = f(Xnew,Ynew)
print('test8x8=',test8x8)
plot1=plt.figure(1)
plt.title('test 4X4')
fig1 = plt.figure(1)
ax1 = fig1.gca(projection='3d')
ax1.plot_surface(x.T,y.T, test4x4, alpha = 1, rstride=1, cstride=1, linewidth=0.5, antialiased=True, zorder = 0.5)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
ax1.plot_surface(Xnew.T, Ynew.T, test8x8, alpha = 1, rstride=1, cstride=1, linewidth=0.5, antialiased=True, zorder = 0.5)
plt.grid()
plt.show()
I think I could solve this problem, I should use x1,y1 = np.meshgrid(Xnew,Ynew)
.
Upvotes: 0
Views: 663
Reputation: 18812
For 8x8, you also need a meshgrid:
...
Xnew = np.linspace(mymin,mymax,8)
Ynew = np.linspace(mymin,mymax,8)
xx, yy = np.meshgrid(Xnew, Ynew) #You need this
And use this meshgrid to plot
ax1.plot_surface(xx.T, yy.T, test8x8, alpha=0.5, rstride=1, cstride=1, \
linewidth=0.5, antialiased=True, zorder = 10)
Use alpha=0.5
in both plot_surface()
, so that, you can see both surfaces.
To separate the 2 surfaces more distinctly, you can try the second .plot_surface()
as
ax1.plot_surface(xx.T, yy.T, 0.0001+test8x8, alpha=0.5, rstride=1, cstride=1, \
linewidth=0.5, antialiased=True, zorder = 10)
The value 0.0001 brings the second surface higher (in z-direction).
Upvotes: 1