如何构建 numpy 二维数组的直方图
How to build a histogram of numpy 2 dimensional array
我有一个 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 矩阵)时显示以下结果:
然而,这两个直方图似乎都是错误的,我后来验证了:
>>> 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
如何构建正确的直方图?
P.s: Here is the file 如果你能帮助我。
数据似乎是离散的。在两半处设置明确的 bin 边界可以显示每个值的频率。由于有非常高但不常见的值,以下示例在 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()
另一个可视化可以显示 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()
另一个可视化集中在对角线值上:
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')
我有一个 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 矩阵)时显示以下结果:
然而,这两个直方图似乎都是错误的,我后来验证了:
>>> 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
如何构建正确的直方图?
P.s: Here is the file 如果你能帮助我。
数据似乎是离散的。在两半处设置明确的 bin 边界可以显示每个值的频率。由于有非常高但不常见的值,以下示例在 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()
另一个可视化可以显示 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()
另一个可视化集中在对角线值上:
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')