Python 如何在matplotlib中创建类似符号的绘图?
我正在尝试使用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 标签sec1 sec2 从5.0638.293开始 时间0.184 1.033 停止5.247 9.326 如果X是 0Python 如何在matplotlib中创建类似符号的绘图?,python,matplotlib,Python,Matplotlib,我正在尝试使用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 标签sec1 sec2 从5.0638.293开始 时间0.184 1.033 停止5.247 9.326 如果X是 0
有什么建议吗?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()
对于x值,我们使用np.append将开始和停止连接在一起,使用np.sort
按时间顺序对它们进行排序,并使用np.repeat将每个值重复两次。
然后我们将正确的值设置为1(顺序是(0,1,1,0)
,因此我们将从第二个值开始的每四个值和从第三个值开始的每四个值设置为1。非常有指导意义(我建议使用该解决方案,因为它已经正确处理了重叠的间隔)我只想补充一点,严格地说,这个解决方案不会给出矩形脉冲,而是一系列在交叉点非常陡峭(但不是垂直)的虚线
因此,为了完整起见,生成矩形脉冲的一种方法(假设1.开始时间和结束时间分别存储在数组开始时间和停止时间,以及2.间隔不重叠!)是:
这将取每对开始
-停止
对,用相应的值1或0复制它们,以获得矩形脉冲,如(开始,0)-(开始,1)-(停止,1)-(停止,0)
,然后添加起始数据点和结束数据点,然后将构造的点集分配给两个数组x
和y
。按常规使用plt进行绘图。绘图(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)
matplotlib只绘制点,因此您只需向plt提供正确的y点。plot(x,y)
哦,我明白了。我需要一些集合,比如y点列表(0或1)但是我如何才能根据小的间隔来列出这个列表呢?很好的解决方案。但对我来说,它肯定远远超出了一行的界限。我肯定会在一个适当的for循环中将它分成几行。@MaxNoe谢谢,我认为你的解决方案更实用,所以我只是把它保留在原来的形式,纯粹作为一个proof of of concept。但是,是的,你是对的,我会添加一个非OLFED版本。我在我的答案中添加了一个numpy解决方案。@MaxNoe是的,我看到了。感觉应该很容易推广到处理重叠…但OP可能无论如何都不需要。
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)])
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)