python 中的不等宽分箱直方图
Unequal width binned histogram in python
我有一个数组,其中存储了概率值。有些值为 0。我需要绘制一个直方图,使每个 bin 中的元素数量相等。我尝试使用 matplotlibs hist 函数,但这让我可以决定垃圾箱的数量。我该如何着手绘制这个?(正常的情节和历史工作,但它不是所需要的)
我有 10000 个条目。只有 200 个值大于 0 且介于 0.0005 和 0.2 之间。这个分布甚至不是 0.2 只有一个元素有而 2000 大约有值 0.0005。所以绘制它是一个问题,因为容器的宽度必须不等且元素数量相同
这个任务对我来说没有多大意义,但下面的代码确实如此,我理解为要做的事情。
我还认为代码的最后几行是您真正想要做的。使用不同的 bin 宽度来改进可视化(但不要针对每个 bin 内等量样本的分布)!我用了 astroml's hist with method='blocks' (astropy supports this too)
代码
# Python 3 -> beware the // operator!
import numpy as np
import matplotlib.pyplot as plt
from astroML import plotting as amlp
N_VALUES = 1000
N_BINS = 100
# Create fake data
prob_array = np.random.randn(N_VALUES)
prob_array /= np.max(np.abs(prob_array),axis=0) # scale a bit
# Sort array
prob_array = np.sort(prob_array)
# Calculate bin-borders,
bin_borders = [np.amin(prob_array)] + [prob_array[(N_VALUES // N_BINS) * i] for i in range(1, N_BINS)] + [np.amax(prob_array)]
print('SAMPLES: ', prob_array)
print('BIN-BORDERS: ', bin_borders)
# Plot hist
counts, x, y = plt.hist(prob_array, bins=bin_borders)
plt.xlim(bin_borders[0], bin_borders[-1] + 1e-2)
print('COUNTS: ', counts)
plt.show()
# And this is, what i think, what you really want
fig, (ax1, ax2) = plt.subplots(2)
left_blob = np.random.randn(N_VALUES/10) + 3
right_blob = np.random.randn(N_VALUES) + 110
both = np.hstack((left_blob, right_blob)) # data is hard to visualize with equal bin-widths
ax1.hist(both)
amlp.hist(both, bins='blocks', ax=ax2)
plt.show()
输出
我有一个数组,其中存储了概率值。有些值为 0。我需要绘制一个直方图,使每个 bin 中的元素数量相等。我尝试使用 matplotlibs hist 函数,但这让我可以决定垃圾箱的数量。我该如何着手绘制这个?(正常的情节和历史工作,但它不是所需要的)
我有 10000 个条目。只有 200 个值大于 0 且介于 0.0005 和 0.2 之间。这个分布甚至不是 0.2 只有一个元素有而 2000 大约有值 0.0005。所以绘制它是一个问题,因为容器的宽度必须不等且元素数量相同
这个任务对我来说没有多大意义,但下面的代码确实如此,我理解为要做的事情。
我还认为代码的最后几行是您真正想要做的。使用不同的 bin 宽度来改进可视化(但不要针对每个 bin 内等量样本的分布)!我用了 astroml's hist with method='blocks' (astropy supports this too)
代码
# Python 3 -> beware the // operator!
import numpy as np
import matplotlib.pyplot as plt
from astroML import plotting as amlp
N_VALUES = 1000
N_BINS = 100
# Create fake data
prob_array = np.random.randn(N_VALUES)
prob_array /= np.max(np.abs(prob_array),axis=0) # scale a bit
# Sort array
prob_array = np.sort(prob_array)
# Calculate bin-borders,
bin_borders = [np.amin(prob_array)] + [prob_array[(N_VALUES // N_BINS) * i] for i in range(1, N_BINS)] + [np.amax(prob_array)]
print('SAMPLES: ', prob_array)
print('BIN-BORDERS: ', bin_borders)
# Plot hist
counts, x, y = plt.hist(prob_array, bins=bin_borders)
plt.xlim(bin_borders[0], bin_borders[-1] + 1e-2)
print('COUNTS: ', counts)
plt.show()
# And this is, what i think, what you really want
fig, (ax1, ax2) = plt.subplots(2)
left_blob = np.random.randn(N_VALUES/10) + 3
right_blob = np.random.randn(N_VALUES) + 110
both = np.hstack((left_blob, right_blob)) # data is hard to visualize with equal bin-widths
ax1.hist(both)
amlp.hist(both, bins='blocks', ax=ax2)
plt.show()