我试图用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()
提前谢谢!
如前所述,
0 -> -inf
在对数刻度中。因此,任何小于或等于零的绘制值都是有问题的(需要日志空间中的无限ylim)。此问题的存在与是否使用fill_between()无关。幸运的是,matplotlib提供了一种很好地处理这个问题的方法。在默认行为中,matplotlib屏蔽每个小于或等于零的值。在您的示例中,这意味着您的整个
y=0
线被屏蔽,并从定义填充区域的多边形中排除。结果是,通过画一条从(100,10)
向下和向左到(0,0)
的直线,多边形是简单地闭合的。另一个选择是剪裁值。在这种情况下,它们被设置为1e-300
,并且在确定图的ylim时不被参考。因此,要获得所需的结果,请执行以下操作:使用对数y刻度,
fill_between(x, y, 0)
告诉matplotlib填充log(0) = -infinity
和log(y)
之间的区域。当然,它会结巴。您可以通过将0
改为1e-6
这样的小数字来避免这个问题。相关问题 更多 >
编程相关推荐