0

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()

1

I think I could solve this problem, I should use x1,y1 = np.meshgrid(Xnew,Ynew).

1 Answer 1

1

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).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.