【问题标题】:Python histogram has always incorrect binsPython直方图总是有错误的bin
【发布时间】:2019-04-27 09:49:35
【问题描述】:

我正在尝试使用 plt.hist 在 Python 中绘制直方图。这是我要绘制的数组:

[162 162 162 161 162 157 162 161 164 161 163 160 155 162 160 154 162 162 163 160 162 157 162 160 165 161 162 161 155 163 161 155 162 162 162 161 163 156 163 160 165 161 163 161 154 162 160 155 163 163 163 161 162 156 162 160 165 161 162 160 154 163 161 155 163 162 163 160 163 157 163 161 165 161 162 160 155 162 160 155 164 164 159 155 161 159 158 160 161 161 155 159 154 154 156 155 160 160 163 158 160 163 159 156 159 162 156 163 155 154 156 152 158 158 154 156 158 158 156 157 158 160 160 159 153 152 153 150 154 155 158 158 159 160 156 157 163 157 158 159 159 155 156 157 154 155 157 158 155 154 155 157 160 154 154 157 157 157 156 153 157 156 156 161 157 155 154 153 159 158 157 157 158 155 159 154 156 156 156 158 159 155 150 148 158 159 156 157 157 155 157 158 158 158 157 156 157 153 159 156 160 156 158 156 156 153 156 156 157 157 157 157 160 157 156 156 159 155 154 158 156 155 154 160 158 158 159 155 155 158 158 156 155 156 151 158 157 156 156 155 158 158 159 157 155 158 157 154 157 157 157 159 155 156 154 156]

这是我的简单代码:

hst = plt.hist(stego_histogram , bins=256) 
plt.show()

这个数组是由图像的一些像素构成的。显然,8 位深度图像有 256 个值,这就是我选择那个 bin 的原因。然而,当这个值从 148 变为 165 时,直方图返回这个范围内的值,但分成 256 个值。

我尝试使用其他 bin 值 (16,17,18..) 配置直方图,但它从来没有打印好。这是 bins=18 的直方图:

如何正确绘制此直方图?我只想要这个值的条形直方图。谢谢。

【问题讨论】:

  • 在 plt.hist() 中,指定 range=(0, 255)
  • 你能说出你想要的输出/分箱吗?你的代码对我来说很好
  • 以下任何答案是否能解决您的问题?如果他们这样做,则将您找到的最佳答案标记为已接受。由于您似乎是 Stack Overflow 的新手,您应该阅读What should I do when someone answers my question?

标签: python arrays matplotlib histogram


【解决方案1】:

直方图的作用只是计算一个值重复的次数,然后为每个可能的值绘制一个垂直条,每个垂直条的高度就是该值出现的次数。

如果您想要 0 到 255 之间的完整直方图,则需要在 hist 调用中指定名为 range 的参数。

否则您也可以使用 matplotlib 中的 bar 方法来显示您在此处提供的数组。

这里是documentation for matplot bar

【讨论】:

    【解决方案2】:

    我真的不知道为什么,但是使用 bins=17 一切都可以正常绘制。问题是间隔不是整数,正如您在我附上的图表中看到的那样。我之前尝试过这个 bins 值,但它不起作用。很抱歉,感谢您的回答!

    【讨论】:

      【解决方案3】:

      您需要的不是直方图,而是频率条形图。可以使用Counter 计算频率。在下面的答案中,将data 替换为您的实际数据列表。

      import matplotlib.pyplot as plt
      from collections import Counter
      
      data = [162, 162, 162, 161, 162, 157, 162, 159, 155, 155, 158, 158, 156]
      
      freqs = Counter(data)
      plt.bar(freqs.keys(), freqs.values())
      plt.show()
      

      【讨论】:

        【解决方案4】:

        IIUC,你想要这样的东西:

        counts, bins, _ = plt.hist(data, bins=range(256))
        plt.show()
        

        输出:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-14
          • 1970-01-01
          • 2015-03-22
          • 2016-06-21
          • 2020-03-28
          • 2011-10-14
          • 2019-04-16
          • 1970-01-01
          相关资源
          最近更新 更多