概述
fill_between
和fill_betweenx
函数的作用都是填充两条曲线之间的区域。其中
fill_between
函数作用是填充两条水平曲线之间的区域。fill_betweenx
函数作用是填充两条垂直曲线之间的区域。
两者参数非常相似,仅数据参数的名称、含义稍有不同。
fill_between
函数的签名为:matplotlib.pyplot.fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
fill_betweenx
函数的签名为:matplotlib.pyplot.fill_betweenx(y, x1, x2=0, where=None , interpolate=False,step=None,*, data=None, **kwargs)
fill_between
函数
fill_between
函数的签名为:matplotlib.pyplot.fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
参数说明如下:
x
:定义两条曲线的节点的x坐标。长度为N
的类数组结构。必备参数。y1
:定义曲线的节点的y坐标。长度为N
的类数组结构或者标量。必备参数。y2
:定义第2条曲线的节点的y坐标。长度为N
的类数组结构或者标量,默认值为0
。可选参数。where
:根据条件排除一些填充区域。长度为N
的布尔数组。默认值为None
。可选参数。interpolate
:当该属性为True
时将计算实际交点,并将填充区域延伸到此点。布尔值。默认值为False
。注意:该属性只有使用了where
属性且两条曲线相互交叉时才生效。step
:拐点的计算方式。字符串,取值范围为{'pre', 'post', 'mid'}
。默认值为None
。可选参数。**kwargs
:PolyCollection
对象的相关属性。
fill_between
函数的返回值为PolyCollection
对象。
注意事项:
建议x
,y1
,y2
使用数组结构,这样where
参数的应用更加灵活。
两条曲线分别由(x,y1)
和(x,y2)
定义。两条曲线具有相同的x坐标。
两个曲线之间的填充区域可能有多个。
通过where
参数可以排除一些填充区域。
默认直接连接给定点构成曲线。可以使用step
函数改变连接点。
案例:演示fill_between的基本用法
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']='simhei'
plt.rcParams['axes.unicode_minus']=False
# 构造x坐标
x = np.arange(0.0, 2, 0.01)
# 构造y1曲线的y坐标
y1 = np.sin(2 * np.pi * x)
# 构造y2曲线的y坐标
y2 = 0.8 * np.sin(4 * np.pi * x)
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(6, 6))
# 参数y2 默认值为0
ax1.fill_between(x, y1)
ax1.set_title('填充y1与0之间的区域')
# 参数y2 的值为标量1
ax2.fill_between(x, y1, 1)
ax2.set_title('填充y1与0之间的区域')
ax3.fill_between(x, y1, y2)
ax3.set_title('填充y1与y2之间的区域')
ax3.set_xlabel('x')
plt.show()
案例:置信带
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']='simhei'
plt.rcParams['axes.unicode_minus']=False
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1, 9.9, 13.9, 15.1, 12.5]
# 拟合曲线,并估计其y值及误差。
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +
(x - x.mean())**2 / np.sum((x - x.mean())**2))
# 绘制拟合线
plt.plot(x, y_est, '-')
# 填充置信带
plt.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
# 绘制数据点
plt.plot(x, y, 'o', color='tab:brown')
plt.show()
案例:演示interpolation参数
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']='simhei'
plt.rcParams['axes.unicode_minus']=False
x = np.array([0, 1, 2, 3])
y1 = np.array([0.8, 0.8, 0.2, 0.2])
y2 = np.array([0, 0, 1, 1])
plt.subplot(211)
plt.title('interpolation=False')
# 绘制两条曲线
plt.plot(x, y1, 'o--')
plt.plot(x, y2, 'o--')
# 绘制曲线间填充
plt.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3)
plt.fill_between(x, y1, y2, where=(y1 < y2), color='C1', alpha=0.3)
plt.subplot(212)
plt.title('interpolation=True')
# 绘制两条曲线
plt.plot(x, y1, 'o--')
plt.plot(x, y2, 'o--')
# 绘制曲线间填充
plt.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3,
interpolate=True)
plt.fill_between(x, y1, y2, where=(y1 <= y2), color='C1', alpha=0.3,
interpolate=True)
plt.tight_layout()
plt.show()
案例:演示where参数
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family']='simhei'
plt.rcParams['axes.unicode_minus']=False
x = np.arange(-5, 5, 0.01)
y1 = -5*x*x + x + 10
y2 = 5*x*x + x
plt.plot(x, y1, x, y2, color='black')
plt.fill_between(x, y1, y2, where=(y2 > y1), facecolor='yellow', alpha=0.5)
plt.fill_between(x, y1, y2, where=(y2 <= y1), facecolor='red', alpha=0.5)
plt.title('Fill Between')
plt.show()