【问题标题】:Draw a line if value of signal is bigger than mean of the signal如果信号的值大于信号的平均值,则画一条线
【发布时间】:2020-05-02 15:44:53
【问题描述】:

当我的信号值大于该信号的平均值时,我想在图表上画一条线。我的信号是肌肉拉动和放松的简单串联。

muscle_on2 = np.random.uniform(-1, 1, 1000) + offs
muscle_off = np.random.uniform(-0.05, 0.05, 500) + offs
emg = np.concatenate([muscle_off, muscle_on1, muscle_off, muscle_on2, muscle_off])

为了做到这一点,我尝试了这样的事情:

pl.plot(x_axis)
for i in range(0, len(emg), 1):
    if emg[i]>RM:
        pl.plot([i, 1.0], [i, 1.0], 'r-', lw=5)

RM 在哪里:

RM = np.mean(emg)

然而,它不是产生水平线,而是产生垂直线:

有人可以帮我解决这个问题吗?

我忘了澄清这一点,在这种情况下,偏移量(偏移量已被过滤掉)这部分代码是为了显示我的信号是如何创建的。当我打印出照片上的平均值时,它在 0.26 左右振荡。我希望我的线在信号值大于平均值时出现,并在信号值小于平均值时结束。

【问题讨论】:

  • 您的代码中的offs 是什么?请提供minimal reproducible example。也不清楚你希望你的线路如何?水平的?这条线的延伸是什么?
  • 对不起。我忘了澄清它,在这种情况下偏移(偏移已被过滤掉)这部分代码是为了显示我的信号是如何创建的。当我打印出照片上的平均值时,它在 0.26 左右振荡。我希望我的线在信号值大于平均值时出现,并在信号值小于平均值时结束。
  • 你有机会看看我的回答吗?这种方法是否能给你想要的输出?

标签: python if-statement matplotlib signal-processing


【解决方案1】:

您应该使用matplotlib.pyplot.axhline

import matplotlib.pyplot as plt
import numpy as np

muscle_on2 = np.random.uniform(0, 1, 1000)
muscle_off = np.random.uniform(0, 0.05, 500)
emg = np.concatenate([muscle_off, muscle_on2, muscle_off])
RM = np.mean(emg)
plt.plot(emg)
plt.axhline(RM, color='r')
plt.show()

哪个会给你

matplotlib.pyplot.hlines,如果您不想一路穿越情节,

import matplotlib.pyplot as plt
import numpy as np

muscle_on2 = np.random.uniform(0, 1, 1000)
muscle_off = np.random.uniform(0, 0.05, 500)
emg = np.concatenate([muscle_off, muscle_on2, muscle_off])
e = x[emg > RM]
plt.plot(x, emg)
plt.hlines(RM, e[0], e[-1], color='r', lw=2, zorder=3)
plt.show()


注意   -   importmatplotlib.pyplot 的约定是

import matplotlib.pyplot as plt

deprecated pylab 的约定是

import matplotlib.pylab as pl

如果您使用的是pylab,那么您应该按照official usage guide 的指示切换到pyplot

【讨论】:

  • 这是一个很好的解决方案,但我想它可以很容易地向量化。如果你那时还没有,我会在有时间的时候整理一些东西。
  • @anishtain4 是的,有一个更简单的过滤方法:x[emg > RM] - 我应该首先使用它
  • 必须使用它和np.diff 的组合来找到行的开头和结尾,然后可以使用plt.hlines 一次绘制所有这些。
  • @anishtain4 如果您想要数据的移动平均值超过平均值的多个区域。为简单起见,我忽略了这一点,如果 OP 消除歧义在信号值大于平均值时出现并在信号值小于平均值时结束我将相应地修改我的答案
猜你喜欢
  • 2019-01-18
  • 2021-04-15
  • 2013-12-27
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多