在numpy/matplotlib中求插值数据的零点
我有一些二维范围的数据,想要进行分析。这些数据最开始是以列表的形式存在,分别是x、y和z,其中z[i]表示位于(x[i], y[i])这个点的值。然后,我使用
x=np.array(x)
y=np.array(y)
z=np.array(z)
xi=np.linspace(minx,maxx,100)
yi=np.linspace(miny,maxy,100)
zi=griddata(x,y,z,xi,yi)
把这些数据插值到一个规则的网格上。
接着,我用
plt.contour(xi,yi,zi)
plt.pcolormesh(xi,yi,zi,cmap=plt.get_cmap('PRGn'),norm=plt.Normalize(-10,10),vmin=-10,vmax=10)
把xi、yi、zi的数据画了出来。
这就生成了这个图:
在这个图中,你可以看到一个S形的曲线,表示值为零的地方(顺便说一下,数据的变化并没有图中的颜色条显示得那么快——那只是因为我把数据标准化到了-10到10之间,而实际上数据的范围远远超过这个;我这么做是为了让零值区域更明显显示出来——也许还有更好的方法来做到这一点……)。
那些散点只是我原始数据所在的点(是的,在这个例子中,我的数据已经在一个规则的网格上了)。我想知道有没有好的方法来提取出曲线为零的值,并获得x、y的配对,这样如果把它们画成一条线,就能描绘出颜色网格中的零区域。我可以插值到一个非常细的网格,然后强行搜索最接近零的值。但有没有更自动化的方法来做到这一点,或者更自动化的方法来绘制这个“零线”?
还有一个附带的问题:我使用griddata的方法是对的吗?我有这些简单的一维数组,虽然在其他地方,有人使用各种网格、加载文本等,才调用griddata。
1 个回答
1
这里有一个完整的例子:
import numpy as np
import matplotlib.pyplot as plt
y, x = np.ogrid[-1.5:1.5:200j, -1.5:1.5:200j]
f = (x**2 + y**2)**4 - (x**2 - y**2)**2
plt.figure(figsize=(9,4))
plt.subplot(121)
extent = [np.min(x), np.max(x), np.min(y), np.max(y)]
cs = plt.contour(f, extent=extent, levels=[0.1],
colors=["b", "r"], linestyles=["solid", "dashed"], linewidths=[2, 2])
plt.subplot(122)
# get the points on the lines
for c in cs.collections:
data = c.get_paths()[0].vertices
plt.plot(data[:,0], data[:,1],
color=c.get_color()[0], linewidth=c.get_linewidth()[0])
plt.show()
这是输出结果: