在loglibplot python中以对数刻度填充曲线下面积

时间:2012-02-28 20:10:09

标签: python matplotlib

我正在尝试使用matplotlib填充曲线下的区域。下面的脚本运行正常。

import matplotlib.pyplot as plt
from math import sqrt
x = range(100)
y = [sqrt(i) for i in x]
plt.plot(x,y,color='k',lw=2)
plt.fill_between(x,y,0,color='0.8')
plt.show()

但是,如果我将y标度设置为对数(见下文)。它有时会填满曲线上方的区域!谁能帮我?我想填充曲线和y = 0之间的区域。

x = range(100)
y = [sqrt(i) for i in x]
plt.plot(x,y,color='k',lw=2)
plt.fill_between(x,y,0,color='0.8')
plt.yscale('log')
plt.show()

提前致谢!

2 个答案:

答案 0 :(得分:13)

使用对数y标度,fill_between(x, y, 0)告诉matplotlib填充log(0) = -infinitylog(y)之间的区域。当然,它很好玩。您可以将0更改为1e-6之类的小数字来避免此问题。

答案 1 :(得分:2)

如上所述,0 -> -inf的对数比例。因此,任何小于或等于零的绘制值都是有问题的(在对数空间中需要无限的ylim)。此问题的存在与您是否使用fill_between()无关。

幸运的是,matplotlib提供了一种很好地处理这个问题的方法。在默认行为中,matplotlib会屏蔽小于或等于零的每个值的值。在您的示例中,这意味着整个y=0行被屏蔽并从定义填充区域的多边形中排除。结果是通过从(100,10)向下和向左绘制一条线到(0,0)来简单地关闭多边形。另一种选择是剪切值。在这种情况下,它们设置为1e-300,并且在确定绘图的ylim时不会参考。因此,要获得所需结果,请执行以下操作:

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