从matplotlib获取步骤函数值

2024-04-29 04:38:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个带数据的numpy数组,比如x,y,我应用plt.step()并得到它的连续(阶跃)曲线

我希望能够自己创建这个函数,这意味着我希望对xy值有一个(零阶保持)阶跃近似值,该值实际上不存在于原始x数组中

例如,在以下链接中,我希望得到“新”的实际矩形正弦值,而不仅仅是打印: https://matplotlib.org/gallery/lines_bars_and_markers/step_demo.html#sphx-glr-gallery-lines-bars-and-markers-step-demo-py


Tags: and数据函数numpydemostepplt数组
2条回答

您可以使用scipy的interp1d创建一个step函数。默认插值为“线性”,但对于阶跃函数,可以将其更改为“下一步”、“上一步”或“最近”

step_fun = interp1d(x, y, kind='previous')获得一个标准步骤函数,然后将其称为step_fun(new_x)

以下代码比较了不同类型的“插值”:

from matplotlib import pyplot as plt
import numpy as np
from scipy.interpolate import interp1d

x = np.random.uniform(0.1, 0.7, 20).cumsum()
y = np.sin(x)

kinds = ['linear', 'previous', 'next', 'nearest', 'cubic']
for i, kind in enumerate(kinds):
    function_from_points = interp1d(x, y + i, kind=kind)
    x_detailed = np.linspace(x[0], x[-1], 1000)
    plt.plot(x_detailed, function_from_points(x_detailed), color='dodgerblue')
    plt.scatter(x, y + i, color='crimson')
plt.yticks(range(len(kinds)), kinds)
plt.show()

example plot

您可以根据需要选择勾号值和相应的函数值。这是一个不等距参数及其值的示例:

x = np.arange(20) + np.random.random(20)/2
y = np.sin(x / 2)**2 + np.random.random(20)/5

备注:这两个数组的大小必须相等。如果您想要自己的自定义函数,可以使用np.vectorise

x = np.arange(20) + np.random.random(20)/2
func = np.vectorize(lambda x: np.sin(x) + np.random.random()/5)
y = func(x)

相关问题 更多 >