在numpy/matplotlib中求插值数据的零点

1 投票
1 回答
582 浏览
提问于 2025-04-18 02:53

我有一些二维范围的数据,想要进行分析。这些数据最开始是以列表的形式存在,分别是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的数据画了出来。

这就生成了这个图:contour plot

在这个图中,你可以看到一个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()

这是输出结果:

在这里输入图片描述

撰写回答