哎呀,真的,这些函数看博客有些不靠谱……

别看其他的了,就看我这个就行了……

以后只看官方文档就好了……

官方文档: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()

python中contourf的使用 python contourf函数_python中contourf的使用

这种情况,实际上我们可以连X0,X1都不用给,因为你的y实际上已经确定出了一个等势图。

如果我们把x0,x1去掉,你会得到:

python中contourf的使用 python contourf函数_取值_02

有时间,可以把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。

python中contourf的使用 python contourf函数_hg_03

 

第二种给法是通过meshgrid这个函数转换。

meshgrid就和她名字一样,叫融合网格(别嘲笑我翻译),把他们那些一维的array-like的东西做成网格。

我们换个元组,x0=[1,2,3],x1=[5,6,7]。

它到底是怎么“融合”的呢?

给个图你填空:

这图左边竖着的列是x0、上面横着的一行是x1,他们这样摆,能两人能组成一套坐标矩阵,

每个括号左边写x0对应的值,右边写x1对应的值。


python中contourf的使用 python contourf函数_hg_04

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