此问题基于:Smooth surface Plot with Pyplot
我正试图在我的地块上弄一个安抚的表面。我正在使用numpy.linspace
定义我的x和y轴,但看来划分多少并不重要,图形到达一个不会变得更平滑的点,看起来像这样:
在所引用的问题中,解决方案是在新网格中使用插值函数。我不知道它是如何工作的,但是当我尝试修改它时,我得到了错误的图:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy import interpolate
def func(x,y):
return np.cos(y*x)
def short_proj():
return np.dot(Axes3D.get_proj(ax), scale)
# Computing grid ---------------------------------------------------------
x_limits = [0,10]
y_limits = [-5,5]
xaxis = np.linspace(x_limits[0], x_limits[1], 100)
yaxis = np.linspace(y_limits[0], y_limits[1], 100)
x = xaxis[:,None]
y = yaxis[None,:]
z = func(x,y)
tck = interpolate.bisplrep(x*y,y*x,z,s=0)
znew = interpolate.bisplev(xaxis,yaxis,tck)
# ------------------------------------------------------------------------
# Plotting ---------------------------------------------------------------
fig = plt.figure()
ax = fig.gca(projection='3d')
x_scale = 1
y_scale = (y_limits[1]-y_limits[0])/(x_limits[1]-x_limits[0])
z_scale = (np.amax(z)-np.amin(z))/(x_limits[1]-x_limits[0])
scale=np.diag([x_scale, y_scale, z_scale, 1.0])
scale=scale*(1.0/scale.max())
scale[3,3]=1.0
ax.get_proj=short_proj
surf = ax.plot_surface(x, y, znew, cmap=plt.cm.jet) # to plot the original graph just change 'znew' for 'z'
plt.show()
# ------------------------------------------------------------------------
有人可以告诉我如何在该图上获得更平滑的表面吗?