python中的对数y轴箱
Posted
技术标签:
【中文标题】python中的对数y轴箱【英文标题】:Logarithmic y-axis bins in python 【发布时间】:2013-07-30 21:50:31 【问题描述】:我正在尝试创建数据列的直方图并以对数方式绘制 (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.hist
行中添加Log=true
而不是plt.yscale('log')
,我也尝试过ax.set_yscale('log')
,但似乎没有任何效果。我要么得到一个空图,要么y-axis
确实是对数的(代码如上所示),但没有绘制数据(没有箱)。
【问题讨论】:
Python Pyplot Bar Plot bars disapear when using log scale的可能重复 相关问题,不同的解决方案 【参考方案1】:试试
plt.yscale('log', nonposy='clip')
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale
问题在于条形的底部位于 y=0 处,默认设置是在进行日志转换时屏蔽无效点 (log(0)
-> 未定义)(讨论过更改此设置,但我不记得它走了哪条路)所以当它试图为你的条形图绘制矩形时,底边被遮住了 -> 没有矩形。
【讨论】:
感谢您的回答。您提出的解决方案解决了消失的条形图,但随后又出现了另一个“错误”:y 对数轴的所有标签都绘制在彼此之上。通过注释“ax.set_ylim(0, 30)”行解决了最后一个问题。 是的,因为限制中的 0 被剪裁为一个非常小的数字,所以你有一个不合理的几十年数。请改用ax.set_ylim(1, 30)
。【参考方案2】:
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)
【讨论】:
【参考方案3】: hist 构造函数接受log
参数。
你可以这样做:
plt.hist(data, bins=bins, log=True)
【讨论】:
以上是关于python中的对数y轴箱的主要内容,如果未能解决你的问题,请参考以下文章
python使用matplotlib可视化线图(line plot)使用semilogy函数将Y轴数据处理为对数坐标(logarithmic scale in Matplotlib)