我正在尝试创建数据列的直方图并以对数方式绘制(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=true
代替plt.hist
而我尝试ax.set_yscale('log')
,但似乎没有任何效果。我要么得到一个空图,要么y-axis
确实是对数的(代码如上所示),但是没有绘制数据(没有箱子)。
答案 0 :(得分:71)
尝试
plt.yscale('log', nonposy='clip')
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale
问题是条形图的底部是y = 0,默认是在进行日志转换时屏蔽无效点(log(0)
- >未定义)(有关于更改此内容的讨论) ,但我不记得它走了哪条路)所以当它试图为你的条形图绘制矩形时,底边被掩盖了 - >没有矩形。
答案 1 :(得分:3)
np.logspace返回[1-10]
中的bin,对数间隔 - 在我的情况下xx是npvector> 0所以下面的代码可以解决这个问题
logbins=np.max(xx)*(np.logspace(0, 1, num=1000) - 1)/9
hh,ee=np.histogram(xx, density=True, bins=logbins)
答案 2 :(得分:0)
hist 构造函数接受 log
参数。
你可以这样做:
plt.hist(data, bins=bins, log=True)