文章目录
- 示例
- 参数
- 回归图
示例
在绘图时经常遇到类似区域填充的问题,比如对于
y
=
sin
x
y=\sin x
y=sinx函数,想填充其与X轴所围成的区间,那么就可以使用fill_between
函数。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 2, 0.01)
y = np.sin(2 * np.pi * x)
plt.plot(x, y, color='black')
plt.fill_between(x, y)
plt.grid()
plt.show()
效果如下
参数
fill_between参数如下,其中x, y1, y2
都是数组,表示希望覆盖的范围,具体逻辑是,对于某点
x
i
x_i
xi,将对应的
[
y
1
i
,
y
2
i
]
[y_{1i}, y_{2i}]
[y1i,y2i]范围内涂上颜色。在上面的示例中,只设置了x
和y1
,而y2
默认为0,所以绘制的就是y1
到0范围内的值。
fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *,**kwargs)
其他参数含义如下
- where 可以指定参与绘图的范围,一般是一个布尔型数组
- interpolate 为
True
时采用插值 - step 可选’pre’, ‘post’, ‘mid’,表示步进方案
plt.plot(x, y, color='black')
plt.fill_between(x, y, where=y > 0, facecolor='green', alpha=.5)
plt.fill_between(x, y, where=y < 0, facecolor='red', alpha=.5)
plt.show()
结果如图
回归图
有了这种填充工具,就可以做出类似seaborn
中的lmplot
,这种图形在数据拟合时十分有用,可以在除了拟合线之外,再将数据的分布范围标出。
首先创造一组带有误差的 y = 2 x + 1 y=2x+1 y=2x+1数据,并通过最小二乘法得到其拟合参数。
x = np.arange(0, 2, 0.02)
err = np.random.rand(100)/2
y = 2*x + 1 + err
# 构造并调用最小二乘法
A = np.array([x, np.ones_like(x)]).T
kb, res, _, _ = np.linalg.lstsq(A, y)
下面就对拟合结果进行绘制,首先根据拟合出来的 k , b k, b k,b,来得到趋势线 Y = k x + b Y=kx+b Y=kx+b,然后调用绘图函数,对原始数据、趋势线、分布区间进行绘制
Y = kb[0]*x + kb[1]
dx = (x-x.mean())**2
E = x.std() * np.sqrt(1/len(x) + dx / np.sum(dx))
plt.scatter(x, y, marker='.') # 原始数据
plt.plot(x, Y) # 趋势线
plt.fill_between(x, Y - E, Y + E, alpha=0.5)
plt.show()
效果如下