在3D绘图中平滑大数据

时间:2016-08-25 14:04:42

标签: python matplotlib plot 3d

我使用matplotlib和Axes3D在Python中制作了3D绘图。它看起来很不错,但由于我正在绘制多少数据,它有很多锯齿状的边缘。我在数据上尝试过scipy插值方法,但plot_surface命令不喜欢给出的类型。我还没有找到关于这个主题的其他内容。

到目前为止,这是我的代码:

import numpy
import scipy.io as sio
from matplotlib import pyplot 
import matplotlib
from mpl_toolkits.mplot3d import Axes3D
import scipy

#data pulled from file
matFile = sio.loadmat(matFileLocation)
data = matFile['data']
[numrows, numcols] = numpy.shape(numpy.atleast_2d(data))
fig = pyplot.figure()
ax = fig.gca(projection = '3d')
x = range(numcols)
y = range(numrows)
X, Y = numpy.meshgrid(x,y)
hImage = ax.plot_surface(X,Y,data,cmap = 'jet', rstride = 1, cstride = 10, linewidth=0, antialiased = False)
fig.colorbar(hImage)
hImage.set_clim(mindb, maxdb)
pyplot.show()

请注意,x,y和数据将根据我运行的不同文件而更改。我们非常感谢正确方向上的一点。

修改:尝试的方法

在过去的两天里,我从太多不同的例子中尝试了很多不同的插值方法,以至于我无法记住我所拥有的并且没有尝试过。我想我记得griddatainterp2d和一些hImage.imshow(interpolation='gaussian')(或者那种效果)。 Griddata返回了plot_surface无法理解的内容,interp2d从未完成,hImage将我的整个绘图变为黄色,没有像我期望的那样缩放变化。

我还尝试过其他方法,例如将数据与2D数组进行卷积并除以2D数组的长度。不幸的是,我的数据包含很多非常低的值,因此我在卷积中丢失了很少的高值。 编辑:我忘了除以len ^ 2,现在这些值更有意义。

我基本上是在寻找MatLab的shading interp

1 个答案:

答案 0 :(得分:0)

我最终用二维数组对数据进行卷积并除以新数组的长度。

def movingaverage(interval, window_size, mindb):
    window= numpy.ones((int(window_size),int(window_size)))/(float(window_size)**2)
    return scipy.signal.convolve2d(interval, window, 'same', fillvalue=mindb)

这是我在寻找其他选项时发现的移动平均类型的函数。它平滑了我的3d图,虽然它确实有降低高峰的权衡,因为我的大部分数据都具有较低的z轴值。