哎呀,真的,这些函数看博客有些不靠谱……
别看其他的了,就看我这个就行了……
以后只看官方文档就好了……
官方文档:https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contourf.html
正如其所言,contourf本质上是画等势图,那么它总是要确定整个等势图的取值。
contour([X, Y,] Z, [levels], **kwargs)
level是分几层,这个没什么好说的。
关于X、Y、Z这几个个参数:
显然这里说了两种给参数的方式。
一种是X和Y都是长度分别为N和M的一维的list(只要array like就可以了),Z是N*M的二维list就可以。
这种给法,就确定了整个平面的整个取值:
X(通过list中最大值最小值)确定纵坐标长度、Y(通过list中最大值最小值)确定横坐标长度,Z在(Xi,Yi)指定点上有指定的值Zi。
例子:
import matplotlib.pyplot as plt
if __name__=='__main__':
x0=[1,3,2,4,5,6]
x1=[2,3,4,5,1,6]
y=[
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[2,2,2,2,2,2],
[2,2,2,2,2,2],
[2,2,2,2,2,2],
]
plt.contourf(x0, x1, y, cmap=plt.cm.Spectral, alpha=0.8)
plt.show()
这种情况,实际上我们可以连X0,X1都不用给,因为你的y实际上已经确定出了一个等势图。
如果我们把x0,x1去掉,你会得到:
有时间,可以把y改成:
y=[
[1,1,1,1,1,1],
[1,1,2,2,1,1],
[1,2,3,3,2,1],
[1,2,3,3,2,1],
[1,2,2,2,1,1],
[1,1,1,1,1,1],
]
结果你也能够看得出来,是一个小山峰,他会根据你网格的长宽中的取值自动给你配0-M和0-N。
第二种给法是通过meshgrid这个函数转换。
meshgrid就和她名字一样,叫融合网格(别嘲笑我翻译),把他们那些一维的array-like的东西做成网格。
我们换个元组,x0=[1,2,3],x1=[5,6,7]。
它到底是怎么“融合”的呢?
给个图你填空:
这图左边竖着的列是x0、上面横着的一行是x1,他们这样摆,能两人能组成一套坐标矩阵,
每个括号左边写x0对应的值,右边写x1对应的值。
图1
写完之后应该是:
(1,5) (1,6) (1,7)
(2,5) (2,6) (2,7)
(3,5) (3,6) (3,7)
换个新的y:
y=
y = [
[1, 1, 1 ],
[1, 1, 2 ],
[1, 2, 3 ],
]
分别把y的每个元素和上面我打字出来的相应位置数对矩阵对应,这个意思。
meshgrid的返回值:
把每个数对左边的值取出来组成一个矩阵,然后把右边的取出来组成一个矩阵,这就是meshgrid分别返回的两个返回值。
再具体一点,(你可以拿笔纸自己写啊~~码字好累……)
第一个和第二个返回值是:
1 1 1 5 6 7
第一个: 2 2 2 第二个: 5 6 7
3 3 3 5 6 7
那么干嘛要搞这个嘛!
实际上,在第一种给法里,y矩阵的各个值是有位置的,每一个y值都对应一个数对(A,B)。第一种给法函数默认认定y的元素的位置是是顺序的,相当于x0=[0,1,2],x1=[0,1,2]。
默认的话:
(2,0) (2,1) (2,2)
(1,0) (1,1) (1,2)
(0,0) (0,1) (0,2)
meshgrid可以不用默认这个方法,改变y矩阵的元素对应的数对。
一个和第一个例子等价的,用meshgrid的例子:
if __name__=='__main__':
x0,x1=np.meshgrid([1,2,3,4,5,6],[1,2,3,4,5,6])
y = [
[1, 1, 1, 1, 1, 1],
[1, 1, 2, 2, 1, 1],
[1, 2, 3, 3, 2, 1],
[1, 2, 3, 3, 2, 1],
[1, 2, 2, 2, 1, 1],
[1, 1, 1, 1, 1, 1],
]
plt.contourf(x0,x1, y, cmap=plt.cm.Spectral, alpha=0.8)
plt.show()