我试图在matplotlib的基础上制作类似于签名的情节:
x轴是以秒为单位的间隔:0-60 如果x在开始和停止之间,则绘图将为1。 在其他地方它应该是0。
label sec1 sec2 start 5.063 8.293 time 0.184 1.033 stop 5.247 9.326
所以如果X是
0< X< 5.063 - > 0
5.063 =< X =< 5,247 - > 1
5.247< X< 8.293 - > 0
8.293 =< X =< 9.326 - > 1
9.326< X< 60 - > 0
会有更多的部分,而不仅仅是两部分,而且这条线应该是连续的。
也许这是一个简单的问题,但我对python和matplotlib相当新。 我试图谷歌它,但所有答案都是关于罪恶情节而不是标志情节。我甚至不确定谷歌要找到正确的答案。
有什么建议吗?
答案 0 :(得分:2)
Matplotlib绘制点,而不是函数。你必须提供 正确的y点。你可以这样做:
import numpy as np
import matplotlib.pyplot as plt
starts = np.arange(1, 55, 4)
stops = starts + 1
x = np.linspace(0, 60, 1000)
y = np.zeros_like(x)
for start, stop in zip(starts, stops):
mask = np.logical_and(x > start, x <= stop)
y[mask] = 1
plt.plot(x, y)
plt.ylim(0, 1.1)
plt.show()
结果:
假设开始和停止不重叠,这是一个更好的解决方案:
import numpy as np
import matplotlib.pyplot as plt
starts = np.arange(1, 55, 4)
stops = starts + 1
x = np.repeat(np.sort(np.append(starts, stops)), 2)
y = np.zeros_like(x)
y[1::4] = 1
y[2::4] = 1
plt.plot(x, y)
对于我们加入的x值,我们与np.append
一起开始和停止,对它们进行排序,使其按照np.sort
的时间顺序排列,并使用np.repeat
重复每个值两次。
然后我们将正确的值设置为1(顺序为(0, 1, 1, 0)
,因此我们设置从第二个值开始的每四个值和从第三个值开始的每四个值为1.
答案 1 :(得分:0)
The solution of @MaxNoe非常有启发性和有意义(我建议使用该解决方案,因为它正确处理了重叠间隔)。我只想补充一点,严格来说,解决方案并不能给你提供矩形脉冲,而是一系列在交叉处非常陡峭(但不是垂直)的断线。
因此,为了完整起见,一种生成矩形脉冲的方法(假设1.您的开始和结束时间分别存储在数组starts
和stops
中,以及2。间隔不重叠!)是:
x,y=zip(*[(0,0)]+[item for start,stop in zip(starts,stops) for item in [(start,0),(start,1),(stop,1),(stop,0)]]+[(60,0)])
这将采用每个start
- stop
对,使用相应的值1或0复制它们,以获得像(start,0) -- (start,1) -- (stop,1) -- (stop,0)
这样的矩形脉冲,然后添加起始和结束数据点,然后将构造的点集分配给两个数组x
和y
。绘图照常使用plt.plot(x,y)
完成。
编辑:这里有一个更详细的相同算法实现:
tmplist=[]
for start, stop in zip(starts, stops):
tmplist.extend([(start,0),(start,1),(stop,1),(stop,0)])
tmplist=[(0,0)] + tmplist + [(60,0)]
x,y=zip(*tmplist)
plt.plot(x,y)