在python中绘制二进制数据

时间:2017-09-14 09:48:22

标签: python list matplotlib plot binary

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

bash(增加整数的随机模式)

我想在二进制水平线上绘制它,以便data = [1,2,4,5,9]中指定的每个x值y = 1,否则为零。

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

binary plot

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

由于

2 个答案:

答案 0 :(得分:3)

你明白了。您可以在数据中指定的任何位置创建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轴上的数据数组。 E.g,

>>> 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]

假设您有data1data2data3来绘制堆积,您可以这样说:

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])并且您不喜欢在图中间消失的情节,则可以调整{{1}再次强制将其范围强制到数据的最大范围。

binary_data()

修改:@ImportanceOfBeingErnest建议,如果您希望执行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() data转换而无需定义自己的bindata功能,则可以使用{ {1}}。叠加它们时要多加注意:

binary_data()

答案 1 :(得分:2)

您可以创建一个包含全零的数组,并为数据中的这些元素指定<?xml version="1.0" encoding="UTF-8"?> <persons xmlns="http://cos-git.dev" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:r="http://www.w3school.com.cn"> <person > <full_name>Tony Smith</full_name> <child_name>Cecilie</child_name> <r:children > <r:childname>Name</r:childname> <r:childname>Name1</r:childname> </r:children> </person> </persons>

1

然后您可以使用步进功能

绘制它
import numpy as np

data = [1,2,4,5,9]
t = np.arange(0,data[-1]+1)
x = np.zeros_like(t)
x[data] = 1

enter image description here

import matplotlib.pyplot as plt plt.step(t,x, where="post") plt.show() ,具体取决于如何解释数据

enter image description here