【问题标题】:Get step function values from matplotlib从 matplotlib 获取阶跃函数值
【发布时间】:2020-12-16 07:50:03
【问题描述】:

我有 2 个带有数据的 numpy 数组,比如 x,y,我应用 plt.step() 并获得它的连续(步进)曲线。

我希望能够自己创建此函数,这意味着我希望对xy 的值有一个(零阶保持)近似值,而原始@ 中实际上并不存在987654326@数组。

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

【问题讨论】:

    标签: python numpy matplotlib curve-fitting


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

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

      step_fun = interp1d(x, y, kind='previous')得到一个标准的step函数,然后调用它为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()
      

      【讨论】:

        猜你喜欢
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 2015-10-27
        • 1970-01-01
        相关资源
        最近更新 更多