使用Pyplot进行光滑表面绘图

der*_*erM 2 python numpy matplotlib

我的问题几乎与此相似: 从矩阵平滑表面图

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

我成功地生成了一个X,Y和Z网格来绘制

fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='summer', rstride=1, cstride=1, alpa=None)
Run Code Online (Sandbox Code Playgroud)

然而,由于价值观非常突然,它看起来非常糟糕. Exampleplot  - 非常前卫,丑陋......不可用和东西

我想让事情变得平滑,至少使顶点连接起来,或者看起来像那样.

我的数据生成如下:我有一个功能

svOfMatrix(x, y)
Run Code Online (Sandbox Code Playgroud)

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

由于这个计算非常昂贵,我不想让x的步骤太小,并且Y必然是整数.
此外,即使是非常小的步骤,也可能会有一些变化,我不想看到.所以我想以某种方式插入它.我找到了 http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/interpolate.html, 但我没有让它发挥作用.

Ed *_*ith 9

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

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()
Run Code Online (Sandbox Code Playgroud)

此外,antialiased=True可能会让它看起来更好,但我认为默认情况下.第一个情节看起来像这样,

在此输入图像描述

和这样平滑的情节,

在此输入图像描述

您的数据中的低频噪声问题在于难以定义足够精细的网格来解决.您可以使用s参数调整平滑级别,interpolate.bisplrep或者粗粒度/过滤数据以仅留下主要趋势(例如,scipy.ndimage.interpolation.zoom如果您有常规网格化数据,则使用).或者,考虑一种不同类型的绘图,例如pcolormesh,因为数据本质上是2D.