2017-09-14 103 views
2

二進制數據我有一些數據,看起來像:繪製在python

data = [1,2,4,5,9](增加整數隨機模式)

我想繪製它的二進制水平線,從而y = 1,每x值在data中指定,否則爲零。

我有一些不同的data陣列,我想棧,類似於這種風格(這是CCD的時鐘數據,但情節格式看起來理想)

binary plot

我想我需要爲我的數據數組創建一個列表,但是如何爲不在數組中的所有內容指定零值?

謝謝

回答

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軸移動數據數組。例如,

>>> 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])和你不喜歡的是,在圖的中間消失,您可以再次調整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建議,如果你喜歡,而無需定義自己的binary_data()功能進行databindata轉換,你可以使用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() 
+0

這是完美的太感謝你了! –

2

你可以用全零創建一個數組,並指定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 

你可能會再與階躍函數繪製它

import matplotlib.pyplot as plt 
plt.step(t,x, where="post") 
plt.show() 

enter image description here

或Wi日where = "pre",這取決於如何interprete數據

enter image description here