为等高线图sagemath创建网格和插值(x,y,z)

时间:2012-07-12 09:48:18

标签: numpy scipy interpolation contour sage

!我有(x,y,z)形式的值。通过创建list_plot3d图,我可以清楚地看到它们的间距不是很均匀。它们通常在xy平面上形成3到5个点的小“斑点”。因此,对于插值和最终的“轮廓”绘图更好,或者我应该说更平滑(?),我是否必须创建一个矩形网格(就像棋盘上的方块),以便数据的blob以某种方式“平滑“?我知道这对某些人来说可能是微不足道的,但我是第一次尝试这个,而且我有点挣扎。我一直在看scipy.interplate.interp2d等scipy软件包,但最后生成的图表非常糟糕。对于像我这样的业余爱好者来说,也许是关于sagemath的2d插值的简短教程?一些忠告?谢谢。

修改

https://docs.google.com/file/d/0Bxv8ab9PeMQVUFhBYWlldU9ib0E/edit?pli=1

这主要是它与此消息一起产生的那种图形:

Warning:     No more knots can be added because the number of B-spline
coefficients
    already exceeds the number of data points m. Probably causes:
either
    s or m too small. (fp>s)
    kx,ky=3,3 nx,ny=17,20 m=200 fp=4696.972223 s=0.000000

要获得此图表,我只需运行此命令:

f_interpolation = scipy.interpolate.interp2d(*zip(*matrix(C)),kind='cubic')
               plot_interpolation = contour_plot(lambda x,y:
                   f_interpolation(x,y)[0], (22.419,22.439),(37.06,37.08) ,cmap='jet', contours=numpy.arange(0,1400,100), colorbar=True)

               plot_all = plot_interpolation

               plot_all.show(axes_labels=["m", "m"])

矩阵(c)可以是一个巨大的矩阵,如10000 X 3,甚至更像1000000 x 3.不好的图形问题仍然存在,即使数据较少,如我现在添加的图片,其中矩阵(C)只是200 x 3.这就是为什么我开始认为可能除了程序可能存在的故障之外,我使用这个命令的方法可能完全错误,因此我要求建议使用网格和不只是将我的数据“抛出”到命令中。

1 个答案:

答案 0 :(得分:3)

我使用scipy.interpolate.interp2d函数遇到了类似的问题。我的理解是问题出现是因为interp1d / interp2d和相关函数使用较旧的FITPACK包装进行基础计算。我能够得到类似于你的问题,使用样条函数,它依赖于更新的FITPACK包装。可以识别样条函数,因为它们的名称中似乎都有大写字母http://docs.scipy.org/doc/scipy/reference/interpolate.html。在scipy安装中,这些较新的函数似乎位于scipy / interpolate / fitpack2.py中,而使用旧包装的函数位于fitpack.py中。

出于您的目的,RectBivariateSpline是我认为您想要的。以下是一些实现RectBivariateSpline的示例代码:

import numpy as np
from scipy import interpolate

# Generate unevenly spaced x/y data for axes
npoints = 25
maxaxis = 100
x = (np.random.rand(npoints)*maxaxis) - maxaxis/2.
y = (np.random.rand(npoints)*maxaxis) - maxaxis/2.
xsort = np.sort(x)
ysort = np.sort(y)

# Generate the z-data, which first requires converting
# x/y data into grids
xg, yg = np.meshgrid(xsort,ysort)
z = xg**2 - yg**2

# Generate the interpolated, evenly spaced data
# Note that the min/max of x/y isn't necessarily 0 and 100 since
# randomly chosen points were used. If we want to avoid extrapolation,
# the explicit min/max must be found
interppoints = 100
xinterp = np.linspace(xsort[0],xsort[-1],interppoints)
yinterp = np.linspace(ysort[0],ysort[-1],interppoints)

# Generate the kernel that will be used for interpolation
# Note that the default version uses three coefficients for
# interpolation (i.e. parabolic, a*x**2 + b*x +c). Higher order
# interpolation can be used by setting kx and ky to larger 
# integers, i.e. interpolate.RectBivariateSpline(xsort,ysort,z,kx=5,ky=5)
kernel = interpolate.RectBivariateSpline(xsort,ysort,z)

# Now calculate the linear, interpolated data
zinterp = kernel(xinterp, yinterp)