Python xyz数据中的Matplotlib轮廓:griddata索引无效

Python xyz数据中的Matplotlib轮廓:griddata索引无效,python,matplotlib,interpolation,Python,Matplotlib,Interpolation,我正在尝试使用以下格式的文件的matplotlib绘制等高线图: x1 y1 z1 x2 y2 z2 等 我可以用numpy.loadtxt加载它来获得向量。到目前为止,没有问题 我读这篇文章是为了学习如何绘图,并且可以通过复制粘贴来复制它,因此我确信我的安装没有问题: 我知道我必须输入x和y作为向量,z作为数组,这可以通过griddata完成。这也是我在这个网站上发现的 文件说: Zi= GrDATA(x,y,z,席,yi)适合于z=f*(*x,y)形式的表面到(通常)非均匀间隔向量(x,

我正在尝试使用以下格式的文件的matplotlib绘制等高线图:

x1 y1 z1

x2 y2 z2

我可以用numpy.loadtxt加载它来获得向量。到目前为止,没有问题

我读这篇文章是为了学习如何绘图,并且可以通过复制粘贴来复制它,因此我确信我的安装没有问题:

我知道我必须输入x和y作为向量,z作为数组,这可以通过griddata完成。这也是我在这个网站上发现的

文件说:

Zi= GrDATA(x,y,z,席,yi)适合于z=f*(*x,y)形式的表面到(通常)非均匀间隔向量(x,y,z)中的数据。griddata()在(xi,yi)指定的点处插值该曲面以生成zi。席和彝必须描述一个规则的网格,可以是1D或2D,但必须是单调递增的。

为了示例,我编写了以下代码:

将numpy导入为np
将matplotlib.pyplot作为plt导入
将matplotlib.mlab导入为ml
x=np.linspace(1,10,20)
y=np.linspace(1,10,20)
z=np.linspace(1,2,20)
xi=np.linspace(1,10,10)
yi=np.linspace(1,10,10)
Zi= ML.GRIDDATA(x,y,z,席,彝)
但是,对于griddata,我会遇到以下错误: 索引器:索引无效

因此,我尝试对文档的示例进行一些修改,如下所示:

从matplotlib.mlab导入网格数据
将matplotlib.pyplot作为plt导入
将numpy作为np导入
x=np.linspace(-2.1,2.1300)
y=np.linspace(-2.1,2.1300)
z=x*np.exp(-x**2-y**2)
#定义网格。
席=NP·林空间(-2.1,2.1100)
yi=np.linspace(-2.1,2.1200)
#网格化数据。
ZI= GRIDATDATA(X,Y,Z,席,Y,Ip= =‘线性’)
我得到了同样的错误。我不明白出了什么问题

谢谢你的帮助。

考虑一下:

x = np.linspace(1., 10., 20)
y = np.linspace(1., 10., 20)
z = np.linspace(1., 2., 20)
这意味着我们知道沿直线
x=y
的某些点的z值

从那里

zi = ml.griddata(x,y,z,xi,yi)
要求
mlab.griddata
外推矩形网格中所有点的
z

我们已经给出了很多关于
z
如何沿这条线变化的信息,但是没有给出关于
z
如何沿垂直方向(远离
x=y
线)变化的信息。由于
mlab.griddata
拒绝猜测,正在引发错误

如果您的初始
x
y
数据分布更加随机,您将获得更好的结果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
# x = np.linspace(1, 10, ndata)
# y = np.linspace(1, 10, ndata)

x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)

xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
zi = ml.griddata(x, y, z, xi, yi)

plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))

plt.colorbar() 
plt.scatter(x, y, marker = 'o', c = 'b', s = 5, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()


如果希望
mlab.griddata
沿
x=y
线以任意方式将数据外推到整个网格,可以添加两个额外的边界点
(xmin,ymax,z[0])
(xmax,ymin,z[-1])


好的,我终于找到了绘制它的解决方案。对于那些感兴趣的人来说,这里有一个诀窍:使用Scipy中的griddata和“最近的”方法

从scipy.interpolate导入网格数据
将numpy作为np导入
将matplotlib.pyplot作为plt导入
x=np.linspace(1,10,20)
y=np.linspace(1,10,20)
z=z=np.random.random(20)
xi=np.linspace(1,10,10)
yi=np.linspace(1,10,10)
十、 Y=np.meshgrid(xi,yi)
Z=griddata((x,y),Z,(x,y),method='nearest')
轮廓曲线图(X,Y,Z)

这是一种奇怪的行为,我确信Matlab不会对此抱怨。scipy.interpolate.griddata可以使用最近的方法很好地工作,但需要重新运行向量。那么,是否有内置函数从矢量z生成一个矩阵,该矩阵可被contour()接受?我在上面运行模拟的网格是规则的,因此如果我得到你的点,我将无法使用griddata…感谢你的帮助,你的方法对于我希望做的工作也很好,并允许我使用mlab.griddata锁定我的错误。这个示例不适用于我,使用baseMap。它还需要以下行:
xi,yi=np.meshgrid(xi,yi)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml

np.random.seed(8)
ndata = 10
ny, nx = 100, 200
xmin, xmax = 1, 10
ymin, ymax = 1, 10
x = np.linspace(1, 10, ndata)
y = np.linspace(1, 10, ndata)
z = np.random.random(ndata)
x = np.r_[x,xmin,xmax]
y = np.r_[y,ymax,ymin]
z = np.r_[z,z[0],z[-1]]
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)


# Requires installation of natgrid
# http://sourceforge.net/projects/matplotlib/files/matplotlib-toolkits/
zi = ml.griddata(x, y, z, xi, yi, interp='nn')

# Or, without natgrid:
# zi = ml.griddata(x, y, z, xi, yi, interp='linear')

plt.contour(xi, yi, zi, 15, linewidths = 0.5, colors = 'k')
plt.pcolormesh(xi, yi, zi, cmap = plt.get_cmap('rainbow'))

plt.colorbar() 
plt.scatter(x, y, marker = 'o', c = 'b', s = 10, zorder = 10)
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.show()