在Matplotlib Python中,找到与y轴对应的x轴值

6

我想要完成一些简单的任务,例如在matplotlib中读取与y轴值相对应的x轴值,但我不知道出了什么问题。

在这种情况下,我对于找到x=2.0时对应的y轴值很感兴趣,但是即使在xvalues数组中有数字2,idx元组也会为空。

以下是代码:

pyplot.plot(x,y,linestyle='--',linewidth=3)

ax = pyplot.gca()

line = ax.lines[0]

xvalues = line.get_xdata()

yvalues = line.get_ydata()

idx = where(xvalues == 2.0) 

y = yvalues[idx[0][0]]

这是 xvalues 数组:

[1.40000000e+00   1.45000000e+00   1.50000000e+00   1.55000000e+00
1.60000000e+00   1.65000000e+00   1.70000000e+00   1.75000000e+00
1.80000000e+00   1.85000000e+00   1.90000000e+00   1.95000000e+00
2.00000000e+00   2.05000000e+00   2.10000000e+00   2.15000000e+00
2.20000000e+00   2.25000000e+00   2.30000000e+00   2.35000000e+00]

1
你尝试过使用 idx = where(xvalues >= 2.0) 吗? - juanmajmjr
谢谢您的回复。我尝试了一下,实际上这个方法可以工作,即使idx输出了很多值,特别是当xvalues数组有很多元素时。但我想知道是否有更优雅的解决方案。 - Moki
1
这看起来更加优雅: where(xvalues >= 2.0) and (xvalues < 3.0) - juanmajmjr
1个回答

11

你得到一个空数组的原因是严格值2.0实际上不存在于你的数组中。

例如:

In [2]: x = np.arange(1.4, 2.4, 0.05)

In [3]: x
Out[3]:
array([ 1.4 ,  1.45,  1.5 ,  1.55,  1.6 ,  1.65,  1.7 ,  1.75,  1.8 ,
        1.85,  1.9 ,  1.95,  2.  ,  2.05,  2.1 ,  2.15,  2.2 ,  2.25,
        2.3 ,  2.35])

In [4]: x == 2.0
Out[4]:
array([False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False], dtype=bool)

In [5]: np.where(x == 2.0)
Out[5]: (array([], dtype=int64),)

这是浮点数计算限制的一个经典陷阱。如果您愿意,可以这样做:

y[np.isclose(x, 2)]

然而,通常情况下,您希望在给定 x 值处插值 y 值。

例如,假设您想要在 2.01 处获取数值。这个值在您的 x 数组中并不存在。

相反,使用 np.interp 进行线性插值:

In [6]: y = np.cos(x)

In [7]: np.interp(2.01, x, y)
Out[7]: -0.4251320075130563

非常感谢你,乔!现在我明白了。 - Moki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接