2016-05-11 2 views
2

Я заинтересован в построении распределения вероятностей множества точек, которые распределены как степенной закон. Кроме того, я хотел бы использовать логарифмическое биннинг, чтобы иметь возможность сглаживать большие колебания в хвосте. Если я просто использовать логарифмический биннинг, и построить ее на бревне журнала масштаб, такой какМасштабируемое логарифмическое бининг в python

pl.hist(MyList,log=True, bins=pl.logspace(0,3,50)) 
pl.xscale('log') 

, например, то проблема в том, что большие ящики приходятся больше очков, то есть высоты моих закромов не масштабируются по размеру бункера.

Есть ли способ использовать логарифмическое биннинг, и все же сделать python масштабировать все высоты по размеру бункера? Я знаю, что могу, наверное, сделать это с помощью кругового движения вручную, но похоже, что это должна быть функция, которая существует, но я не могу ее найти. Если вы считаете, что гистограммы - это, по сути, плохой способ представить мои данные, и у вас есть лучшая идея, тогда я тоже хотел бы это услышать.

Спасибо!

+0

Вы хотите гистограмму логарифма данных И хотите, чтобы шкала оси y была логарифмической? – wwii

+0

@wwii: Я хочу сделать гистограмму по шкале логарифмической шкалы с биннингами журналов, так что гистограмма на шкале логарифмической шкалы, как представляется, имеет равномерный бинзиз – SarthakC

+0

Извините за неточное самооценку, продвижение, но, возможно, вы можете найти полезную мою библиотеку ** physt **. Среди других функций он предоставляет различные схемы биннинга, один из которых подходит для экспоненциально распределенных значений. См. Http://nbviewer.jupyter.org/github/janpipek/physt/blob/master/doc/Binning.ipynb и https://github.com/janpipek/physt –

ответ

2

Matplotlib не поможет вам, если у вас есть особые требования к вашим гистограммам. Однако вы можете легко создавать и манипулировать гистограммой с помощью numpy.

import numpy as np 
from matplotlib import pyplot as plt 

# something random to plot 
data = (np.random.random(10000)*10)**3 

# log-scaled bins 
bins = np.logspace(0, 3, 50) 
widths = (bins[1:] - bins[:-1]) 

# Calculate histogram 
hist = np.histogram(data, bins=bins) 
# normalize by bin width 
hist_norm = hist[0]/widths 

# plot it! 
plt.bar(bins[:-1], hist_norm, widths) 
plt.xscale('log') 
plt.yscale('log') 

Очевидно, когда вы представить свои данные в неочевидным способом, как это, вы должны быть очень осторожны, о том, как этикетки вашей оси у правильно и написать информативный нижележащим.

+0

Спасибо! :) Это работает для моих целей, хотя я бы предпочел более прямой путь, если он существует. Для силовых законов подобные данные кажутся мне наиболее естественным способом представить данные. Если нет лучшего ответа, связанного с функциональностью matplotlib, прямо на следующий день или около того, я приму свой ответ. – SarthakC

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