如何构建NumPy二维数组的直方图

3

我有一个256x256的值矩阵,我想绘制这些值的直方图。

如果我没有弄错的话,直方图必须在一个值向量中计算,对吗?所以这是我尝试过的:

from skimage.measure import compare_ssim
import numpy as np
import matplotlib.pyplot as plt

d = np.load("BB_Digital.npy")

n, bins, patches = plt.hist(x=d.ravel(), color='#0504aa', bins='auto', alpha=0.7, rwidth=0.85)

plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Blue channel Co-occurency matrix')
maxfreq = n.max()

# Set a clean upper y-axis limit.
plt.ylim(ymax=np.ceil(maxfreq / 10) * 10 if maxfreq % 10 else maxfreq + 10)
plt.show()

然而,我得到了一个非常奇怪的结果:

向量化矩阵结果

当我不使用 ravel 函数(使用 2D 矩阵)时,会显示以下结果:

2D 矩阵的直方图

然而,后来我验证发现这两个直方图都是错误的:

>>> np.count_nonzero(d==0)
51227
>>> np.count_nonzero(d==1)
2529
>>> np.count_nonzero(d==2)
1275
>>> np.count_nonzero(d==3)
885
>>> np.count_nonzero(d==4)
619
>>> np.count_nonzero(d==5)
490
>>> np.count_nonzero(d==6)
403
>>> np.max(d)
12518
>>> np.min(d)
0

我该如何构建正确的直方图?

附注:这是文件,如果您能帮忙。


@Xbel,感谢您的帮助,让我们得到了相同的结果。 - mad
2
@Xbel 这只是因为你的数据过于倾斜了。你的数据中有太多的零值。 - Quang Hoang
即使那样,直方图似乎是错误的,我没有60000个零值 :-( - mad
1
你有51k个零。即使去掉这些零,你的数据仍然偏斜,其中有2.5k个“1”,1.28k个“2”等等。顺便说一下,看起来你正在处理一张图片。你也应该考虑使用cv2 - Quang Hoang
@QuangHoang 谢谢,这是一个共现矩阵,有没有办法使用cv2绘制其直方图或其他东西? - mad
1
在两个轴上使用对数刻度。但我认为最好使用带有色条的plt.imshow - Quang Hoang
1个回答

3
数据似乎是离散的。在中间设置明确的箱界限可以显示每个值的频率。由于存在非常高但不经常出现的值,在以下示例中将截断至50:
import numpy as np
from matplotlib import pyplot as plt

d = np.load("BB_Digital.npy")

plt.hist(d.ravel(), bins=np.arange(-0.5, 51),  color='#0504aa', alpha=0.7, rwidth=0.85)
plt.yscale('log')
plt.margins(x=0.02)
plt.show()

example plot

另一种可视化方法可以展示一个pcolormesh,其中颜色使用对数刻度。由于值从0开始,加1可以避免负无穷大:
from matplotlib import pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np

d = np.load("BB_Digital.npy")
plt.pcolormesh(d + 1, norm=LogNorm(), cmap='inferno')
plt.colorbar()
plt.show()

pcolormesh

另一种可视化方法集中于对角线数值:

plt.plot(np.diagonal(d), color='navy')
ind_max = np.argmax(np.diagonal(d))
plt.vlines(ind_max, 0, d[ind_max, ind_max], colors='crimson', ls=':')
plt.yscale('log')

values on diagonal


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接