我正在尝试使用具有以下格式的文件的matplotlib进行轮廓图绘制:
x1 y1 z1
x2 y2 z2
等等
我可以用numpy.loadtxt加载它以获得向量。到目前为止,没有问题。
我阅读了这篇文章以了解如何进行绘制,并且可以通过复制粘贴来复制它,因此我确定我的安装nothin错了:
http://matplotlib.org/examples/pylab_examples/griddata_demo.html
我知道我必须将x和y输入为向量,将z输入为数组,这可以使用griddata完成。这也是我在本网站上找到的。
该文档说:
为了示例,我编写了以下代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as 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,xi,yi)
但是,当涉及到griddata时,出现以下错误:
IndexError:无效的索引
因此,我尝试对文档的示例进行如下修改:
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2.1,2.1,300)
y = np.linspace(-2.1,2.1,300)
z = x*np.exp(-x**2-y**2)
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,200)
# grid the data.
zi = griddata(x,y,z,xi,yi,interp='linear')
而且我得到了同样的错误。我不明白怎么了。
谢谢你的帮助。
最佳答案
考虑:
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])
: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()
关于python - 来自xyz数据: griddata invalid index的Matplotlib轮廓,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13781025/