2013-10-11 7 views
2

Я построил гистограмму, отражающую веса ячеек в matplotlib. Как видно из приведенной ниже гистограммы, цветное различие настолько размыто, что люди едва видят его. enter image description here Возможно, это связано с тем, как я выбрал взвешивание очков.Как повысить чувствительность 2D-гистограммы в matplotlib?

Как увеличить «чувствительность» от гистограммы, чтобы она могла показывать различия между высокомощными областями и маломощными?


Редактировать

код прилагается по запросу:

def generateFreqMap(trajectories, pointWeightLists, representatives): 
    # these three lists are all in a one-to-one correpondance 
    xOfAllPoints = [point[0] for trajectory in trajectories for point in trajectory] 
    yOfAllPoints = [point[1] for trajectory in trajectories for point in trajectory] 
    weightsOfAllPoints =[pointWeight for pointWeightList in pointWeightLists for pointWeight in pointWeightList] 
    leftBound, rightBound, topBound, bottomBound = min(xOfAllPoints), max(xOfAllPoints), max(yOfAllPoints), min(yOfAllPoints) 
    # parameters for histogram 
    x_edges = np.linspace(int(mt.floor(leftBound)), int(mt.ceil(rightBound)), int(mt.ceil(rightBound))-int(mt.floor(leftBound))+1) 
    y_edges = np.linspace(int(mt.floor(bottomBound)), int(mt.ceil(topBound)), int(mt.ceil(topBound))-int(mt.floor(bottomBound))+1) 
    # construct the histogram 
    wcounts = np.histogram2d(xOfAllPoints, yOfAllPoints, bins=(x_edges, y_edges), normed=False, weights=weightsOfAllPoints)[0] 
    # wcounts is a 2D array, with each element representing the weighted count in a bins 
    # show histogram 
    extent = x_edges[0], x_edges[-1], y_edges[0], y_edges[-1] 
    imshow(np.transpose(wcounts), extent=extent, alpha=0.5, cmap=cm.summer) # alpha controls the transparency 
    plt.xlabel('x (m)') 
    plt.ylabel('y (m)') 
    plt.title('Histogram of %i Trajectories'%TRAJECTORY_NUMBER); 
    savefig(PROJECT_PATH + '\\data\\%i_histogram.svg'%len(trajectories)) 
    return wcounts 

Вес точки го составляет 0,995^я. Таким образом, вес 1-го пункта самый большой, составляет 1.

+0

вы можете передать 'cmin' и' 'cmax' к plt.hist2d' для того, чтобы избежать прокладки бункеров под' cmin' и выше 'cmax', это может позволить вам сузить диапазон интерес ... –

+0

@SaulloCastro действительно новичок здесь, не могли бы вы опубликовать его как полный ответ. Благодаря! –

+0

Пожалуйста, разместите код, который вы используете, чтобы сгенерировать этот рисунок с помощью некоторых поддельных данных. – tacaswell

ответ

1

Использование vmin и vmax параметры imshow().

Проблема в том, что у вас слишком широкий динамический диапазон. Готов поспорить, если вы покажете цветную полосу рядом с гистограммой, вы поймете, почему это происходит немедленно. Поскольку я не могу повторить ваш эксперимент, я дам некоторые догадки об этом.

Например, ваш самый высокий вес среди всех ячеек достигает 500. Между тем, ваш самый низкий вес равен нулю. Тогда ваша гистограмма должна будет перейти от одного цвета к другому, отражая разницу 500. Вот почему различие настолько мало.

Что я предлагаю вам, так это то, что, хотя я не знаю вашей проблемы, но я верю, когда вес превышает определенный уровень, скажем, 50, равнодушно, будь то 51 или 500. Так что с помощью vmin и vmax параметры:

imshow(np.transpose(wcounts), extent=extent, alpha=0.5, cmap=cm.summer, vmin=0, **vmax=50**) # alpha controls the transparency 
0

Вы пробовали выравнивание гистограммы?

попробовать Histogram Equalization of matplotlib color tables

Я просто побежал выше код для тестового изображения в моем каталоге. Он работал хорошо, чтобы выявить детали. Я скопировал и вставил код здесь.

import pylab 
import matplotlib.colors 
import numpy 

im = pylab.imread(inputFile).sum(axis=2) # make grayscale 
pylab.imshow(im, cmap=pylab.cm.gray) 
pylab.title('orig') 
imvals = numpy.sort(im.flatten()) 
lo = imvals[0] 
hi = imvals[-1] 
steps = (imvals[::len(imvals)/256] - lo)/(hi - lo) 
num_steps = float(len(steps)) 
interps = [(s, idx/num_steps, idx/num_steps) for idx, s in enumerate(steps)] 
interps.append((1, 1, 1)) 
cdict = {'red' : interps, 
     'green' : interps, 
     'blue' : interps} 
histeq_cmap = matplotlib.colors.LinearSegmentedColormap('HistEq', cdict) 
pylab.figure() 
pylab.imshow(im, cmap=histeq_cmap) 
pylab.title('histeq') 
pylab.show() 
Смежные вопросы