【问题标题】:use of matlab meshgridmatlab网格网格的使用
【发布时间】:2014-01-23 06:13:02
【问题描述】:

对不起,我不得不继续回到网格不规则间隔数据的问题。对于如何将数据网格化到常规网格的问题,我似乎没有看到任何明确的回答,而对我来说,软件文档对那些已经知道的人来说是件好事。 我有 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 我会得到

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

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

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

出现两个图(并排的底图和等高线)

请帮忙。

【问题讨论】:

  • 明显的错字:在 xi 和 yi 中,你使用 numcols,不应该是 numrows 和 numcols 吗?另一件事:你能更好地缩进你的帖子吗?因为在某个时刻你说“1”。但是没有“2”。 ?
  • 感谢@usethedeathstar 指出拼写错误。 1. 正在读取数据并创建网格 2. 在那里,正在插值

标签: python numpy matplotlib matplotlib-basemap


【解决方案1】:

以下应该有效:

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 也很糟糕,所以你应该只给出正确的输入(我认为这是我制定它们的正确方式),然后它应该可以工作对。

edit:以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()

【讨论】:

  • 感谢您为我指明了正确的方向。现在“print zi”给了我一个像以前一样的数组,但到处都是 nan。我将根据您指出的 scipy 链接继续处理此问题。感谢您的宝贵时间。
  • @ZiloreMumba 这很奇怪,你能打印一些你的数据吗?所以我可以测试它哪里错了?这可能是由于在某处混合了 xi 和 yi,因为如果您不在由您的点限定的凸区域,它会给出 nan(由于 fill_value)
  • 您可以在此处stackoverflow.com/questions/20892251/… 看到我之前的 SO 帖子中的数据,这里是它:Lon Lat Z Z2 pos 32.6 -13.6 41 9 CHIP 27.1 -16.9 43 12 CHOM 32.7 -10.2 46 14 ISOK 24.2 -13.6 33 13 Kabo 28.5 -14.4 43 11 Kabw 28.1 -12.6 33 16 Kafi 27.9 -15.8 46 13 Kafu 24.8 -14.8 44 9 Kaom 31.1 -10.2 35 14 Kasa 25.9 -13.5 24 8 Kase 29.1 -9.8 10 13 Kawa 25.8 -17.8 39 11 LIVI 33.2 -12.3 44 8 隆德
  • @ZiloreMumba 如果你使用 method='nearest' 你会得到什么值?因为我猜它在某处 xi,yi 被颠倒或在你的代码中,导致它几乎在任何地方都给出了 fill_value
  • 感谢您的努力@usethedeathstar。我会晚点回来找你,让我试着摆弄一下。当我输入 method='nearest' 时,我确实得到了一些带有 print zi 的值,尽管它们似乎是错误的并且绘制的轮廓很奇怪。当我使用 method='cubic' 我得到 nan 但轮廓是正确的。所以让我再看一遍代码。
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
相关资源
最近更新 更多