我使用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和数据将根据我运行的不同文件而更改。我们非常感谢正确方向上的一点。
修改:尝试的方法
在过去的两天里,我从太多不同的例子中尝试了很多不同的插值方法,以至于我无法记住我所拥有的并且没有尝试过。我想我记得griddata
,interp2d
和一些hImage.imshow(interpolation='gaussian')
(或者那种效果)。 Griddata返回了plot_surface
无法理解的内容,interp2d从未完成,hImage将我的整个绘图变为黄色,没有像我期望的那样缩放变化。
我还尝试过其他方法,例如将数据与2D数组进行卷积并除以2D数组的长度。不幸的是,我的数据包含很多非常低的值,因此我在卷积中丢失了很少的高值。 编辑:我忘了除以len ^ 2,现在这些值更有意义。
我基本上是在寻找MatLab的shading interp
。
答案 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轴值。