【问题标题】:How to draw a histogram with variable-width bins in Python?如何在 Python 中绘制具有可变宽度 bin 的直方图?
【发布时间】:2020-11-04 12:49:53
【问题描述】:

假设我有数据 [1,2,3, 7,8,9,9, 20,30,40,100,1000] 我想用 Python 为其绘制直方图。我关心的所有 bin 都是 [0,5]、[5,10] 和 [10, +∞)。我该怎么做?

当然,以下不会这样做。

import matplotlib.pyplot as plt

data = [1,2,3, 7,8,9,9, 20,30,40,100,1000]
plt.figure()
plt.hist(data, bins=5, color="rebeccapurple")
plt.show()

【问题讨论】:

  • 直方图用于显示分布。如果您更改它们的大小,则可能会产生误导。也许条形图更符合您的要求?
  • 好点。虽然在某些情况下我们只需要知道有一条肥尾巴

标签: python matplotlib histogram bins


【解决方案1】:

如果强制显示带有自定义 x 范围的直方图,您可能需要先处理数据。

我制作了一个范围列表和 x_ticklabels 以显示 x 轴和范围。

import matplotlib.pyplot as plt
import numpy as np

data = [1,2,3, 7,8,9,9, 20,30,40,100,1000,500,200]
data = np.array(data)
bin_range = [
    [0, 5],
    [5, 10],
    [10, 10000] # enough number to cover range
]

data2plot = np.zeros(len(bin_range))

for idx, (low, high) in enumerate(bin_range):
    data2plot[idx] = ((low <= data) & (data < high)).sum()
    
fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(range(len(bin_range)), data2plot)

x_labels = [
    f"{low}~{high}" for idx, (low, high) in enumerate(bin_range)
]

ax.set_xticks(range(len(bin_range)))
ax.set_xticklabels(x_labels)
plt.show()

【讨论】:

  • 哇...这比我预期的要大!但是使用 barplot 很聪明
  • @PawinData 最复杂的工作是更改 x 轴标签...没有它,代码可以清晰而简短。
  • 只使用ax.set_xticklabels 而不使用ax.set_xticks 可能会很棘手,因为它们是自动设置的。最好在不插入空字符串的情况下设置ax.set_xticks(range(len(bin_range)))ax.set_xticklabels(x_labels)
  • @JohanC 谢谢。你的方法太好了。更新了答案。