如何为曲线下的区域着色

时间:2019-07-10 17:50:35

标签: python matplotlib scipy

我想在曲线下阴影一个区域。这是我的尝试:

from scipy.stats import lognorm
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.linspace(0,10,100)
plt.vlines(2, 0, lognorm.pdf(2,1), color='r', linestyles='solid')
plt.vlines(3, 0, lognorm.pdf(3,1), color='r', linestyles='solid')
plt.fill_between([2,3], [lognorm.pdf(2,1), lognorm.pdf(3,1)], color='red')
plt.plot(xpoints, lognorm.pdf(xpoints,1))

但是,这在曲线下方无法正确显示阴影。

enter image description here

您如何正确执行此操作?

2 个答案:

答案 0 :(得分:1)

使用where

使用where的{​​{1}}参数可以选择填充的范围。

fill_between

enter image description here

与此有关的一个问题可能是原始曲线的最接近所选边界的点可能仍然太远,从而可能会出现间隙。

值得一提的是,如果您选择足够密集的点,或者就此而言,只要足够聪明地选择这些点,就可以避免此类问题。即使用101点,因此2.0和3.0实际上是数据的一部分,

from scipy.stats import lognorm
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
y = lognorm.pdf(x, 1)

plt.vlines(2, 0, lognorm.pdf(2, 1), color='r', linestyles='solid')
plt.vlines(3, 0, lognorm.pdf(3, 1), color='r', linestyles='solid')

plt.fill_between(x, y, where=((x >= 2) & (x <= 3)), color='red')
plt.plot(x, y)

plt.show()

将得到一张漂亮的照片:

enter image description here

绘制曲线的精炼版本。

因此,在更密集的网格上重新评估功能并将其独立绘制可能是有意义的。

x = np.linspace(0, 10, 101)

enter image description here

答案 1 :(得分:0)

您仅基于2个点填充,请尝试以下操作:

plt.fill_between(xpoints[20:31], [lognorm.pdf(i,1) for i in xpoints[20:31]], color='red')