我有一个数组,其中存储了概率值。有些值是 0。我需要绘制一个直方图,以便每个 bin 中有相同数量的元素。我尝试使用 matplotlibs hist 函数,但这让我决定垃圾箱的数量。我该如何绘制这个?(正常的情节和历史工作,但它不是需要的)
我有 10000 个条目。只有 200 的值大于 0 并且介于 0.0005 和 0.2 之间。这种分布甚至不是 0.2 只有一个元素具有,而 2000 大约具有 0.0005 的值。所以绘制它是一个问题,因为箱子的宽度必须不相等,元素数量相等
我有一个数组,其中存储了概率值。有些值是 0。我需要绘制一个直方图,以便每个 bin 中有相同数量的元素。我尝试使用 matplotlibs hist 函数,但这让我决定垃圾箱的数量。我该如何绘制这个?(正常的情节和历史工作,但它不是需要的)
我有 10000 个条目。只有 200 的值大于 0 并且介于 0.0005 和 0.2 之间。这种分布甚至不是 0.2 只有一个元素具有,而 2000 大约具有 0.0005 的值。所以绘制它是一个问题,因为箱子的宽度必须不相等,元素数量相等
这项任务对我来说没有多大意义,但下面的代码确实如此,我理解为要做的事情。
我还认为代码的最后几行是您真正想要做的。使用不同的 bin-width 来提高可视化效果(但不要针对每个 bin 内等量样本的分布)!我用astroml 的 hist 和 method='blocks'(astropy 也支持这个)
# 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()