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轴箱的主要内容,如果未能解决你的问题,请参考以下文章

R中的对数对数概率图

Python中的零对数

使用python中的对数轴缩放和拟合对数正态分布

表示 Exp 中的对数似然。最大化算法

python使用matplotlib可视化线图(line plot)使用semilogy函数将Y轴数据处理为对数坐标(logarithmic scale in Matplotlib)

contest 1169(div 2)