matplotlib Python中的对数y轴箱

yyhrrdl8  于 2023-02-10  发布在  Python
关注(0)|答案(4)|浏览(138)

我试图创建一个数据列的直方图并以对数(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确实是对数的(代码如上所示),但没有绘制数据(没有bin)。

ltskdhd1

ltskdhd11#

尝试

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

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.yscale
问题是条形图的底部位于y=0,默认情况是在进行对数转换时屏蔽无效点(log(0)-〉undefined)(有讨论过改变这一点,但我不记得是哪种方式),所以当它试图为您绘制条形图的矩形时,底部边缘被屏蔽-〉没有矩形。

4c8rllxm

4c8rllxm2#

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

plt.hist(data, bins=bins, log=True)
ax6ht2ek

ax6ht2ek3#

logspace返回[1-10]中的bin,对数间隔-在我的例子中,xx是一个〉0的npvector,所以下面的代码可以实现这个目的

logbins=np.max(xx)*(np.logspace(0, 1, num=1000) - 1)/9
hh,ee=np.histogram(xx, density=True, bins=logbins)
13z8s7eq

13z8s7eq4#

tacaswell's answer是正确的,尽管nonposy关键字参数已经被弃用,而支持nonpositive。此外,指向文档的链接不再有效,请参阅当前文档以获取更多信息。
更新的解决方案:

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

相关问题