直方图条未以 pyplot.hist 中的 xticks 为中心

lo *_*cre 2 python matplotlib histogram

我想我只是没有使用正确的关键字,因为这可能已经被问过,但我没有找到解决方案。不管怎样,我有一个问题,直方图的条形与 xticks 不对齐。我希望条形图位于它们对应的 xticks 的中心,但它们放置在刻度之间以均匀地填充之间的空间。

在此输入图像描述

import matplotlib.pyplot as plt  

data = [1, 1, 1, 1.5, 2, 4, 4, 4, 4, 4.5, 5, 6, 6.5, 7, 9,9, 9.5]

bins = [x+n for n in range(1, 10) for x in [0.0, 0.5]]+[10.0]

plt.hist(data, bins, rwidth = .3)
plt.xticks(bins)
plt.show()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 6

请注意,您在这里绘制的不是直方图。直方图将是

import matplotlib.pyplot as plt  

data = [1, 1, 1, 1.5, 2, 4, 4, 4, 4, 4.5, 5, 6, 6.5, 7, 9,9, 9.5]

bins = [x+n for n in range(1, 10) for x in [0.0, 0.5]]+[10.0]

plt.hist(data, bins, edgecolor="k", alpha=1)
plt.xticks(bins)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这里,条形如预期的那样位于箱之间。例如,区间中有 3 个值1 <= x < 1.5

从概念上讲,您在这里要做的是获取数据值计数的条形图。这根本不需要任何垃圾箱,可以按如下方式完成:

import numpy as np
import matplotlib.pyplot as plt  

data = [1, 1, 1, 1.5, 2, 4, 4, 4, 4, 4.5, 5, 6, 6.5, 7, 9,9, 9.5]

u, inv = np.unique(data, return_inverse=True)
counts = np.bincount(inv)

plt.bar(u, counts, width=0.3)

plt.xticks(np.arange(1,10,0.5))
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当然,您可以“滥用”直方图来获得类似的结果。这需要将条形的中心移动到左垃圾箱边缘,plt.hist(.., align="left")

import matplotlib.pyplot as plt  

data = [1, 1, 1, 1.5, 2, 4, 4, 4, 4, 4.5, 5, 6, 6.5, 7, 9,9, 9.5]

bins = [x+n for n in range(1, 10) for x in [0.0, 0.5]]+[10.0]

plt.hist(data, bins, align="left", rwidth = .6)
plt.xticks(bins)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这会产生与上面相同的图。