matplotlib直方图中的轴不均匀

时间:2018-06-25 09:29:27

标签: python matplotlib

我想使用Matplotlib绘制x轴不均匀的直方图。 例如,考虑以下直方图:

import matplotlib.pyplot as plt
values = [0.68, 0.28, 0.31, 0.5, 0.25, 0.5, 0.002, 0.13, 0.002, 0.2, 0.3, 0.45,
      0.56, 0.53, 0.001, 0.44, 0.008, 0.26, 0., 0.37, 0.03, 0.002, 0.19, 0.18,
      0.04, 0.31, 0.006, 0.6, 0.19, 0.3, 0., 0.46, 0.2, 0.004, 0.06, 0.]
plt.hist(values)
plt.show()

Demo histogram

第一个垃圾箱的密度很高,所以我想在那里放大。

理想情况下,我想将x轴上的值更改为[0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1]之类的值,以使图元内的bin宽度保持恒定(当然,不是数值上的)。有没有简单的方法可以做到这一点? 欢迎任何意见或建议。

2 个答案:

答案 0 :(得分:1)

使用垃圾箱将解决问题。仓位是您为其分配值的值,例如,将0.28分配给仓位0.3。下面的代码为您提供了一个使用垃圾箱的示例:

import matplotlib.pyplot as plt
values = [0.68, 0.28, 0.31, 0.5, 0.25, 0.5, 0.002, 0.13, 0.002, 0.2, 0.3, 0.45,
  0.56, 0.53, 0.001, 0.44, 0.008, 0.26, 0., 0.37, 0.03, 0.002, 0.19, 0.18,
  0.04, 0.31, 0.006, 0.6, 0.19, 0.3, 0., 0.46, 0.2, 0.004, 0.06, 0.]
plt.hist(values, bins=[0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1])
plt.show()

要以更合适的方式绘制图形,可以很方便地将x轴转换为对数刻度:

plt.hist(values, bins=[0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1], log=True)

更改y轴上的对数刻度。在代码中添加以下行将使直方图成为对数x轴:

plt.xscale('log') 

答案 1 :(得分:0)

安德烈(André)的解决方案很好,但是垃圾箱宽度不是恒定的。使用log2 x轴可以满足我的需求。我使用np.logspace使图中的垃圾箱宽度保持不变。

这就是我最终要做的:

import matplotlib.pyplot as plt
values = [0.68, 0.28, 0.31, 0.5, 0.25, 0.5, 0.002, 0.13, 0.002, 0.2, 0.3, 0.45,
        0.56, 0.53, 0.001, 0.44, 0.008, 0.26, 0., 0.37, 0.03, 0.002, 0.19, 0.18,
        0.04, 0.31, 0.006, 0.6, 0.19, 0.3, 0., 0.46, 0.2, 0.004, 0.06, 0.]
bins = np.logspace(-10, 1, 20, base=2)
bins[0]=0
fig, ax = plt.subplots()
plt.hist(values, bins=bins)
ax.set_xscale('log', basex=2)
ax.set_xlim(2**-10, 1)
plt.show()

Histogram log2