我想使用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()
第一个垃圾箱的密度很高,所以我想在那里放大。
理想情况下,我想将x轴上的值更改为[0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1]
之类的值,以使图元内的bin宽度保持恒定(当然,不是数值上的)。有没有简单的方法可以做到这一点?
欢迎任何意见或建议。
答案 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()