56

我正在尝试创建数据列的直方图并以对数方式绘制它(y-axis),但我不确定为什么以下代码不起作用:

import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('foo.bar')
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hist(data, bins=(23.0, 23.5,24.0,24.5,25.0,25.5,26.0,26.5,27.0,27.5,28.0))
ax.set_xlim(23.5, 28)
ax.set_ylim(0, 30)
ax.grid(True)
plt.yscale('log')
plt.show()

我也尝试过而不是plt.yscale('log')添加Log=trueplt.hist,我也尝试过ax.set_yscale('log'),但似乎没有任何效果。我要么得到一个空图,要么y-axis确实是对数的(代码如上所示),但没有绘制数据(没有箱)。

4

3 回答 3

105

尝试

plt.yscale('log', nonposy='clip')

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale

问题在于条形的底部位于 y=0 处,默认值是log(0)在进行日志转换时屏蔽无效点(-> undefined)(讨论过更改此设置,但我不记得哪种方式它去了)所以当它试图为你的条形图绘制矩形时,底边被掩盖了->没有矩形。

于 2013-07-30T16:50:41.887 回答
3

np.logspace 返回 bin 中的[1-10]对数间隔 - 在我的情况下 xx 是 npvector >0 所以下面的代码可以解决问题

logbins=np.max(xx)*(np.logspace(0, 1, num=1000) - 1)/9
hh,ee=np.histogram(xx, density=True, bins=logbins)
于 2016-02-26T05:21:05.887 回答
2

hist 构造函数接受log参数。
你可以这样做:

plt.hist(data, bins=bins, log=True)
于 2021-07-27T16:41:17.020 回答