在python中绘制二进制数据

理查德·霍尔

我有一些看起来像的数据:

data = [1,2,4,5,9] (整数递增的随机模式)

我想将其绘制在二进制水平线上,以使y = 1(对于在其中指定的每个x值)data,否则为零。

data要堆叠一些不同的数组,类似于这种样式(这是CCD时钟数据,但绘图格式看起来很理想)

二元图

我想我需要为数据数组创建一个列表,但是如何为不在数组中的所有内容指定零值?

谢谢

马可

你明白了。您可以1在数据和0其他位置指定的任何位置创建列表列表理解可以很容易地做到这一点

def binary_data(data):
    return [1 if x in data else 0 for x in range(data[-1] + 1)]

它将像这样:

>>> data = [1, 2, 4, 5, 9]
>>> bindata = binary_data(data)
>>> bindata
[0, 1, 1, 0, 1, 1, 0, 0, 0, 1]

现在,所有你需要做的就是剧情吧...或者更好的一步它,因为它是二进制数据,step()看起来更好的方式:

import numpy as np
from matplotlib.pyplot import step, show

def binary_data(data):
    return [1 if x in data else 0 for x in range(data[-1] + 1)]

data = [1, 2, 4, 5, 9]
bindata = binary_data(data)
xaxis = np.arange(0, data[-1] + 1)
yaxis = np.array(bindata)
step(xaxis, yaxis)
show()


要绘制堆叠在同一图形上的多个数据数组,可以进行如下调整binary_data()

def binary_data(data, yshift=0):
    return [yshift+1 if x in data else yshift for x in range(data[-1] + 1)]

因此,现在您可以设置yshift参数以在y轴上移动数据数组。例如,

>>> data = [1, 2, 4, 5, 9]
>>> bindata1 = binary_data(data)
>>> bindata1
[0, 1, 1, 0, 1, 1, 0, 0, 0, 1]
>>> bindata2 = binary_data(data, 2)
>>> bindata2
[2, 3, 3, 2, 3, 3, 2, 2, 2, 3]

假设您有data1data2然后data3将其堆叠,您将像:

import numpy as np
from matplotlib.pyplot import step, show

def binary_data(data, yshift=0):
    return [yshift+1 if x in data else yshift for x in range(data[-1] + 1)]

data1 = [1, 2, 4, 5, 9]
bindata1 = binary_data(data1)
x1 = np.arange(0, data1[-1] + 1)
y1 = np.array(bindata1)

data2 = [1, 4, 9]
bindata2 = binary_data(data2, 2)
x2 = np.arange(0, data2[-1] + 1)
y2 = np.array(bindata2)

data3 = [1, 2, 8, 9]
bindata3 = binary_data(data3, 4)
x3 = np.arange(0, data3[-1] + 1)
y3 = np.array(bindata3)

step(x1, y1, x2, y2, x3, y3)
show()

您可以轻松地进行编辑以使其与任意数量的数据数组一起使用:

data = [ [1, 2, 4, 5, 9],
         [1, 4, 9],
         [1, 2, 8, 9] ]

for shift, d in enumerate(data):
    bindata = binary_data(d, 2 * shift)
    x = np.arange(0, d[-1] + 1)
    y = np.array(bindata)
    step(x, y)

show()


最后,如果要处理长度不同的数据数组(例如[1,2][15,16]),并且您不喜欢图形中间消失的图,则可以binary_data()再次进行调整以将其范围强制为数据的最大范围。

import numpy as np
from matplotlib.pyplot import step, show

def binary_data(data, limit, yshift=0):
    return [yshift+1 if x in data else yshift for x in range(limit)]


data = [  [1, 2, 4, 5, 9, 12, 13, 14],
          [1, 4, 10, 11,  20, 21, 22],
          [1, 2, 3, 4, 15, 16, 17, 18] ]

# find out the longest data to plot
limit = max( [ x[-1] + 1 for x in data] )
x = np.arange(0, limit)

for shift, d in enumerate(data):
    bindata = binary_data(d, limit, 2 * shift)
    y = np.array(bindata)
    step(x, y)

show()


编辑:作为@ImportanceOfBeingErnest建议,如果你喜欢进行databindata不必定义自己的转换binary_data()功能,你可以使用numpy.zeros_like()堆叠它们时,请多加注意:

import numpy as np
from matplotlib.pyplot import step, show

data = [  [1, 2, 4, 5, 9, 12, 13, 14],
          [1, 4, 10, 11,  20, 21, 22],
          [1, 2, 3, 4, 15, 16, 17, 18] ]

# find out the longest data to plot
limit = max( [ x[-1] + 1 for x in data] )
x = np.arange(0, limit)

for shift, d in enumerate(data):
    y = np.zeros_like(x)
    y[d] = 1
    # don't forget to shift
    y += 2*shift
    step(x, y)

show()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章