使用matlab meshgrid

时间:2014-01-05 22:07:39

标签: python numpy matplotlib matplotlib-basemap

对不起,我必须继续回到网格化不规则间隔数据的问题。我似乎没有看到任何关于如何将数据网格化到常规网格的问题的明确回答,对我来说,软件文档对于那些已经知道的人来说是好的。 我有29点的x,y,z数据,标题为“Lon Lat Z”。我在这里用这些数据绘制轮廓:

  1. 读入数据后,制作一个300 x 300点的规则网格进行插值

    numcols, numrows = 300, 300
    xi = np.linspace(data.Lon.min(), data.Lon.max(), numcols)
    yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols)
    xi, yi = np.meshgrid(xi, yi)
    

    此时打印xi并打印yi根据我的数据给出x和y,插值超过300x300点。

  2. 通过上面创建的网格插入数据

    x, y, z = data.Lon.values, data.Lat.values, data.Z.values
    zi = griddata(x, y, z, xi, yi)
    

    此时如果我print zi

      

    [[ - - - ..., - - - ]
      [ - - - ......, - - - ]
      [ - - - ......, - - - ]
      ...,
      [ - - - ......, - - - ]
      [ - - - ......, - - - ]
      [ - - - ......, - - - ]]

  3. 我期待看到内插z的值。我还有一个地图对象被定义为由轮廓覆盖。绘图功能为底图和轮廓提供了具有正确轮廓值的单独图形。 我的问题是为什么我得到轮廓的空白值以及它们是如何正确绘制的? 为了完整起见,这是我的绘图功能

    fig=plt.figure(figsize=(8,4.5))
    im = plt.contourf(xi, yi, zi)
    plt.show()
    

    出现两个图(基本地图和轮廓并排)

    请帮助。

1 个答案:

答案 0 :(得分:0)

以下内容应该有效:

numcols, numrows = 300, 300
xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows)
yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols)
xi, yi = np.meshgrid(xi, yi)

x, y, z = data.Lon.values, data.Lat.values, data.Z.values
points = np.vstack((x,y)).T
values = z
wanted = (xi, yi)
zi = griddata(points, values, wanted)

最后一行是griddata的工作原理(假设您使用scipy.interpolate.griddata?) 你遇到的问题是你似乎给了griddata五个参数,而如果我看http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.griddata.html#scipy.interpolate.griddata它说的如下:

scipy.interpolate.griddata(points, values, xi, method='linear', fill_value=nan)

所以在你的情况下,给出五个参数是错误的地方我猜(如果你这样做就确认它是否有效,因为我没有你的数据所以我无法测试它是否给出了正确的结果)。

因此,在您的情况下,您知道值的点是x,而此时已知的值是y值,而您想要知道它们的点是z值。不知道method='linear'如何处理你的论点,而你提供的fill_value也是不好的,所以你应该给出正确的输入(我认为这与我制定它们的方式是正确的),以及它应该正常工作。

编辑:将您的数据作为txt读入,并编写以下代码。你可以运行它,看看这是否是你想要的结果?

import numpy as np
from scipy.interpolate import griddata
class d():
    def __init__(self):
        A0 = open("test.txt","rb") # i just copypasted your data into a txt (without first row), and reading it in in this class, so that the names are the same as yours
        A1 = A0.readlines()
        A = np.zeros((len(A1),3))
        for i, l in enumerate(A1):
            li = l.split()
            A[i,0] = float(li[0])
            A[i,1] = float(li[1])
            A[i,2] = float(li[2])
        self.Lon = A[:,0]
        self.Lat = A[:,1]
        self.Z = A[:,2]

data = d()
numcols, numrows = 30, 30
xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows)
yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols)
xi, yi = np.meshgrid(xi, yi)

x, y, z = data.Lon, data.Lat, data.Z
points = np.vstack((x,y)).T
values = z
wanted = (xi, yi)
zi = griddata(points, values, wanted)
import pylab as plt
fig = plt.figure(0, figsize=(8,4.5))
im = plt.contourf(xi, yi, zi)
plt.colorbar()
fig2 = plt.figure(1, figsize=(8,4.5))
im = plt.scatter(xi, yi, c= zi)
plt.colorbar()
plt.show()