2013-09-15 4 views
1

В основном у меня есть некоторые данные, из которых я сделал гистограмму. Там нет больших трудностей, просто используйте matplotlib.pyplot.hist(data,bins=num) Тем не менее, я хочу сделать своеобразное обнаружение края Собела, где в основном находится гистограммный стол ith (какой бы ни был жаргон) -2*(i-1)th+0*(i)th+2*(i+1)th Я выяснил, что вы можете сделать (мои данные в columnated текстовых файлов)Обнаружение края гистограммы - python

import matplotlib.pyplot as plt 

alldata = np.genfromtxt('filename', delimiter=' ') 
data = alldata[:,18] 
n,bins,patches = plt.hist(data,bins=30) 

Который возвращает/дает

>>> n 
array([3,0,3,3,6,1,...etc]) 

>>> bins 
array([13.755,14.0298,14.3046,... etc]) 

>>> patches 
<a list of 30 Patch objects> 

Здесь я могу выполнять свою работу на n, чтобы получить мой Собели отфильтрованный материал (Примечание стороны: я просто это итеративно o ver массив, есть ли более простой способ с чем-то вроде a = [-2,0,2]?)

Итак, мой вопрос и проблема! Я понятия не имею, как потом воссоздать результат в виде гистограммы или линейного участка ... и держать ту же горизонтальную ось bins


UPDATE


Вот код, который я использовать, чтобы получить это далеко. Загрузить данные HERE

import numpy as np 
import matplotlib.pyplot as plt 

# ignore this, it is so it makes it easier to iterate over later. 
filNM = 'S_MOS152_cut' 
filID = filNM + '.txt' 
nbins = 30 

# extract the data from file 
stars = np.genfromtxt(filID, delimiter=' ') 
imag = stars[:,18] 

# let's start the histogram dance 
n,bins,patches = plt.hist(imag, bins=nbins) 

# now apply the edge filter (manually for lack of a better way) 
nnew=[0 for j in xrange(nbins)] 

for i in range(0,len(n)): 
if i==0: 
    nnew[i]=2*n[i+1] 
elif i==len(n)-1: 
    nnew[i]=-2*n[i-1] 
else: 
    nnew=-2*n[i-1]+2*n[i+1] 

np.array(nnew) 
# I do this because it now generates the same form 
# output as if you just say >>> print plt.hist(imag, bins=nbins) 
filt = nnew,bins,patches 
print filt 

Теперь мне некуда идти, если я пытаюсь построить filt это дает мне ошибку

ответ

1

скажу, сделать гистограмму с np.histogaram, применить Собел фильтр, а затем plt.hist его ,

>>> n, bins=histogram(q, bins=30) 
>>> bin_updated=[item for item, jtem in zip(bins, n) if do_Sobel_stuff_on(jtem)] 
>>> plt.hist(data, bins=bin_updated) 

ОК, в основном, вы хотите использовать .set_height() метод:

>>> a=range(1000) 
>>> n,b,p=plt.hist(a) 
>>> p[0] 
<matplotlib.patches.Rectangle object at 0x026E1070> 
>>> p[0].get_height() 
100 
>>> p[0].set_height(19) 
>>> plt.show() 
>>> n_adjusted #your new n 
>>> for i1, i2 in zip(p, n_adjusted): 
     i1.set_height(i2) 

enter image description here

+0

Это не размер бина, что мне нужно работать на но 'n' существу он изменяет высота гистограмм .... – FriskyGrub

+0

О, мой плохой. См. Править. –

+0

Удивительный, выглядит многообещающим. Я немного побеспокоюсь об этом и вернусь к вам! С другой стороны, он должен работать точно! – FriskyGrub

Смежные вопросы