【发布时间】: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 和数据会根据我运行的不同文件而改变。非常感谢您指出正确的方向。
编辑:尝试的方法
在过去的两天里,我从太多不同的例子中尝试了太多不同的插值方法,以至于我不记得我有什么和没有尝试过什么。我想我记得griddata、interp2d 和一些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