天天看点

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

概述

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

    的类数组结构或者标量,默认值为 。可选参数。
  • 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的基本用法

matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)
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)
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)
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)
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()
           

继续阅读