Python 用Pyplot绘制光滑曲面图

Python 用Pyplot绘制光滑曲面图,python,numpy,matplotlib,Python,Numpy,Matplotlib,我的问题几乎与此类似: 只是我的工具集是matplotlib和numpy(到目前为止) 我已经成功地生成了一个X、Y和Z网格来绘图 与 然而,由于这些值非常不稳定,看起来非常糟糕。 我想平滑一些,至少让顶点连接起来,或者看起来像那样 我的数据是这样生成的: 我有一个函数 svOfMatrix(x, y) 它生成一个依赖于x的矩阵,计算其y次幂,选择列和行的子集,并计算最大奇异值。 Z[x,y]是svof矩阵(x,y) 由于此计算非常昂贵,我不想使x的步长太小,并且Y一定是整数 此外,即使是

我的问题几乎与此类似:

只是我的工具集是matplotlib和numpy(到目前为止)

我已经成功地生成了一个X、Y和Z网格来绘图 与

然而,由于这些值非常不稳定,看起来非常糟糕。

我想平滑一些,至少让顶点连接起来,或者看起来像那样

我的数据是这样生成的: 我有一个函数

svOfMatrix(x, y)
它生成一个依赖于x的矩阵,计算其y次幂,选择列和行的子集,并计算最大奇异值。 Z[x,y]是svof矩阵(x,y)

由于此计算非常昂贵,我不想使x的步长太小,并且Y一定是整数
此外,即使是非常小的步骤,也可能有相当多的变化,我不想看到。所以我想以某种方式对它进行插值。 我发现
但是我无法让它工作。

从您建议的链接中,示例可能与您想要的最接近。您可以将示例与您的值一起使用

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D

X, Y = np.mgrid[-1:1:20j, -1:1:20j]
Z = (X+Y) * np.exp(-6.0*(X*X+Y*Y)) + np.random.rand(X.shape[0])

xnew, ynew = np.mgrid[-1:1:80j, -1:1:80j]
tck = interpolate.bisplrep(X, Y, Z, s=0)
znew = interpolate.bisplev(xnew[:,0], ynew[0,:], tck)

fig = plt.figure(figsize=(12,12))
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, cmap='summer', rstride=1, cstride=1, alpha=None)
plt.show()

fig = plt.figure(figsize=(12,12))
ax = fig.gca(projection='3d')
ax.plot_surface(xnew, ynew, znew, cmap='summer', rstride=1, cstride=1, alpha=None, antialiased=True)
plt.show()
另外,
antialased=True
可能会使它看起来更好,但我认为默认情况下是打开的。第一个情节是这样的

像这样平滑的情节


数据中低频噪声的问题在于,很难定义足够精细的网格来解决。您可以使用
s
参数将平滑级别调整为
interpolate.bisplrep
或粗粒度/过滤数据以仅保留主要趋势(例如,如果您有常规网格数据,则使用)。或者,考虑不同类型的绘图,例如PCORMOSFET,因为数据基本上是2D。p> 多谢各位。如果我重新构建您的示例,它会起作用。根据我的数据,情节看起来完全奇怪。我想我的数据有些奇怪。因此,正如您所提议的,我将使用二维pcolormesh。
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D

X, Y = np.mgrid[-1:1:20j, -1:1:20j]
Z = (X+Y) * np.exp(-6.0*(X*X+Y*Y)) + np.random.rand(X.shape[0])

xnew, ynew = np.mgrid[-1:1:80j, -1:1:80j]
tck = interpolate.bisplrep(X, Y, Z, s=0)
znew = interpolate.bisplev(xnew[:,0], ynew[0,:], tck)

fig = plt.figure(figsize=(12,12))
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, cmap='summer', rstride=1, cstride=1, alpha=None)
plt.show()

fig = plt.figure(figsize=(12,12))
ax = fig.gca(projection='3d')
ax.plot_surface(xnew, ynew, znew, cmap='summer', rstride=1, cstride=1, alpha=None, antialiased=True)
plt.show()