matlibplot python中的曲线下填充区域

2024-04-20 06:10:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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()

提前谢谢!


Tags: inimport区域forplotmatplotlibshowrange
2条回答

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

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

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

使用对数y刻度,fill_between(x, y, 0)告诉matplotlib填充log(0) = -infinitylog(y)之间的区域。当然,它会结巴。您可以通过将0改为1e-6这样的小数字来避免这个问题。

相关问题 更多 >