matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)

概述

fill_betweenfill_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。可选参数。
  • **kwargsPolyCollection对象的相关属性。

fill_between函数的返回值为PolyCollection对象。

注意事项:
建议xy1y2使用数组结构,这样where参数的应用更加灵活。
两条曲线分别由(x,y1)(x,y2)定义。两条曲线具有相同的x坐标。
两个曲线之间的填充区域可能有多个。
通过where参数可以排除一些填充区域。
默认直接连接给定点构成曲线。可以使用step函数改变连接点。

案例:演示fill_between的基本用法

matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)_第1张图片

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()

案例:置信带

matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)_第2张图片

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参数

matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)_第3张图片

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参数

matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)_第4张图片

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()

你可能感兴趣的:(Matplotlib,matplotlib,填充,fill_between,曲线,排除)