matplotlib 连接图中最低的数据点

fdbelqdn  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(136)

我需要绘制一个通过最小x值数据点的曲线图。下面的代码是一个类似于我正在处理的数据的工作示例。请只使用numpymatplotlib,并继续使用plt.subplots()方法。

import numpy as np
import pylab as plt

y = np.random.randint(1,20,50)
fig, ax = plt.subplots()
ax.plot(y, '.')
ax.grid(alpha=0.5)

plt.show()

上面的代码生成了以下绘图:

我需要一个“包围”点的最左边界的图,如下所示:

有什么想法吗?

7lrncoxx

7lrncoxx1#

您需要定义最左边界所在的下限,或者您可以在y轴上对数据进行分组,并在每个分组中找到x值最小的点。我将采用前一种方法并执行以下操作(使用插值器函数):

import numpy as np
import pylab as plt

# import the scipy interpolator
from scipy.interpolate import interp1d

n = 50
y = np.random.randint(1, 20, n)

# set x-positions (as plotted)
x = np.arange(n)

# set lower boundary on x below which we'll find the "edge"
lowbound = 10

# get the y-values below the lowbound
lowy = y[x < lowbound]

# get indices of unique values below the bound
idx = np.unique(lowy, return_index=True)[1]

# get a linear interpolator between the points
ci = interp1d(y[idx], x[idx], kind="linear")

plt.scatter(x, y)

# plot boundary
yvals = np.linspace(y[idx].min(), y[idx].max(), 100)  # points at which to calculate the interpolant
plt.plot(ci(yvals), yvals, color="r")

这给出:

如果你想要一条更弯曲的线,你可以把interp1d中的"linear"改变为,例如,"cubic",但是这并不能保证它不包含边界"内部"的点,或者偏离想象的边界很远。

获得一点曲率但不可能包括边界"内部"点的方法是在进行线性插值之前转换到对数空间,然后再转换回来进行绘图,例如:

ci = interp1d(y[idx], np.log10(x[idx] + lowbound), kind="slinear")
plt.plot(10**ci(yvals) - lowbound, yvals, color="r")

其给出:

其公认地(在这种情况下)与原始线性内插没有太大不同。

hpcdzsge

hpcdzsge2#

假设y值有些离散,则可以执行以下操作

y_unique = np.unique(y)

x_values = np.empty(len(y_unique))

indices = list(range(0, len(y)))

for idx, v in enumerate(y_unique):
    x_values[idx] = np.argmin(indices[y==v])
    

fig, ax = plt.subplots()
ax.plot(y, '.')
ax.grid(alpha=0.5)

plt.scatter(x=x_values, y=y_unique, color="red")

plt.show()

这是来自移动的和未经测试的

相关问题