【问题标题】:Smooth large data in 3D plot在 3D 图中平滑大数据
【发布时间】:2016-08-25 14:04:42
【问题描述】:

我使用 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

【问题讨论】:

  • 您是否有任何代码显示您尝试插入日期的内容/方式?即,您尝试了哪些 SciPy 功能。另外,您是否有可以在 Github 上托管的示例文件或类似的文件供我们与您一起尝试?
  • 另外,您是否尝试过这里的任何建议:stackoverflow.com/a/35158321/1607105
  • @dblclik 是的,我从那个示例开始,但由于数据是二维数组,x 和 y 不是,因此示例中的 tck = interpolate.bisplrep(X, Y, Z, s=0) 不起作用。至于文件,由于工作协议,我真的没有可以托管的文件。我能说的最好的方法是制作一个随机的 [140x50000] 矩阵(或触发器 x 和 y?我在 python 和 matlab 之间混淆了)。至于我尝试过的方法,见编辑?
  • 只是为了确定,您确定要创建一个统一的整数网格吗?您在此处执行此操作:X, Y = numpy.meshgrid(range(numrcols),range(numrows)),但这将创建一个位于 Int x Int 空间中的网格——您的数据是以这种方式生成的吗?您的网格应该符合生成 Z 数据的任何 X 和 Y 步骤,并且它们不必总是相同的数组。你能分享一下 X、Y 和 Z 空间在你的情节中代表什么吗?

标签: python matplotlib plot 3d


【解决方案1】:

我最终将我的数据与一个二维数组进行卷积,然后除以新数组的长度。

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 轴值都很低。

【讨论】:

  • 您需要编辑代码并缩进已定义函数的主体,因为现在它是错误代码,必须被否决。很高兴您找到了适合您的解决方案
  • @dblclik 抱歉!没有意识到当我复制/粘贴它时它没有缩进。谢谢你接听。
  • 没问题,一直发生在我身上(我只是希望有人能一直提醒我!) GL 与你的表面图
  • @dblclik 谢谢!
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2015-06-15
  • 2021-07-16
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多