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)
请注意,您在这里绘制的不是直方图。直方图将是
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)
这会产生与上面相同的图。