Matplotlib是Python提供的一套基于NumPy的绘图工具包,用Python实现与MATLAB相似的命令API,十分适合交互式绘制图表,成为Python中应用非常广的绘图工具包之一。
在对数据可视化时,为了突出某一段数据需要对部分区域进行填充处理。Matplotlib中通过fill_between()函数实现填充两个水平曲线之间的区域。
首先我们通过以下语句,查看fill_between的参数列表
plt.fill_between?
可以看到fill_between()函数语法:
matplotlib.pyplot.fill_between(x,y,y2=0,where=None,interpolate=False,step=None,*,data=None,**kwargs)
参数描述:
x:一个数组,定义水平轴上的点
y:一个数组或者标量,表示y轴覆盖的下限
y2:一个数组或者标量,表示y轴覆盖的上限
where:一个布尔数组,如果需要排除某些垂直区域的填充,则定义该数组。需要注意的是,这个定义意味着两个假值之间的一个孤立的真值将不进行填充。相邻的False值将导致不填充True值的两边
interpolate:接受布尔值,只有在使用了where参数同时两条曲线交叉时才有效。默认情况下,被填充的区域将被放在x阵列的位置,定义一个被填充的多边形区域。与x相交的部分被裁剪。
step:如果填充需要一个步骤函数,则使用该参数。接受'pre'、'post'、'mid'三个值,用于指定步骤将发生的位置。pre代表区间(x[i-1],x[i])的值为y[i],x值向左移动;post代表区间(x[i],x[i+1])的值为y[i],x值向右移动;mid代表步骤发生在x位置的中间。
其余参数描述可见该函数参数列表。
fill_between()函数示例
1.准备工作
#导入库
import numpy as np
import matplotlib.pyplot as plt
#配置中文标签的正常显示
plt.rcParams['font.sans-serif']=['SimHei']
#配置负号的正常显示
plt.rcParams['axes.unicode_minus']=False
2.填充曲线下面部分区域
#准备数据
x=np.linspace(0,1,500)
y=np.sin(3*np.pi*x)
#画曲线
plt.plot(x,y)
#填充曲线
plt.fill_between(x,0,y,facecolor='pink')
3.填充部分区域
#准备数据
x=np.linspace(0,1,500)
y=np.sin(3*np.pi*x)
#画线
plt.plot(x,y)
#填充
plt.fill_between(x[15:300],0,0.2,facecolor='pink')
4 .两条曲线之间的区域填充
#数据准备
x=np.linspace(0,1,500)
y=np.sin(3*np.pi*x)
z=y*2
#画线
plt.plot(x,y,color='b')
plt.plot(x,z,color='r')
#填充
plt.fill_between(x,y,z,facecolor="r",alpha=0.4)
5.根据所给图形写出相应代码
图形
如下图所示
数据
x=np.linspace(-np.pi,np.pi,256,endpoint=True,y=sin(x),y=cos(x))填充区域
紫色区域:(-2.5<x)&(x<-0.5)绿色区域:np.abs(x)<0.5,sinx>0.5
#根据题意准备数据
x=np.linspace(-np.pi,np.pi,256,endpoint=True)
y=np.sin(x)
z=np.cos(x)
#x轴的坐标刻度
textX=[-np.pi,-np.pi/2,0,np.pi/2,np.pi]
#x轴的坐标文本显示
textS=['$-\pi$','$-\pi/2$','0','$\pi/2$','$\pi$']
#画线并设置其label,lw为线条粗细
plt.plot(x,y,lw=2.5,label="正弦sin()")
plt.plot(x,z,lw=2.5,label="余弦sin()")
#将坐标文本显示到对应坐标刻度上
for i in range(5):
plt.text(textX[i],0,textS[i])
#显示网格
plt.grid()
#根据题意填充图形
plt.fill_between(x,z,where=(x>-2.5) & (x<-0.5),color="purple")
plt.fill_between(x,np.abs(x)<0.5,y,y>0.5,color="green")
#显示图标
plt.legend()
plt.show()