![244d14ea74285b8fce70d95af68b057a.png](https://i-blog.csdnimg.cn/blog_migrate/2a03e401ec1c11e5a9570b35c5c4058c.png)
如何用python优雅的画出优雅的contour图
我们选择画一个双曲线的等contour图,其实contour图就是等高线图,那么我们以圆的图为例,即:
在开始之前,我们需要先对matplotlib.pyplot.contour的命令熟悉一下,点击这里查看官方文档,以及这里matplotlib.pyplot.contourf的命令。
contour([X, Y,] Z, [levels], **kwargs)
contourf([X, Y,] Z, [levels], **kwargs)
这里contour画的是等高线中的线,而contourf画的是登高线之间的区域,如下图:
![e18cb48ed6314605d040d37c80c24ea5.png](https://i-blog.csdnimg.cn/blog_migrate/401b93d3b594acf8448e679c8530673d.png)
X,Y都是二维数组,Z是和X,Y相同维数的二维数组。
首先定义一个要画图的方程:
def f(X,Y):
return (X**2+Y**2)
这里x,y参量是一维数组,而X,Y经过网格化后就变成了二维数组,下面我们就要对其各种参数的演示:
import numpy as np
import matplotlib.pyplot as plt
# x轴的刻度向内
plt.rcParams['xtick.direction'] = 'in'
# y轴刻度向内
plt.rcParams['ytick.direction'] = 'in'
# x轴和y轴的步长
stepx = 0.01; stepy = 0.01
# x轴和y轴的变化范围
x = np.arange(-10,10,stepx); y = np.arange(-10,10,stepy)
#对x,y网格化,得到X,Y
X,Y = np.meshgrid(x,y)
# 定义方程
def f(X,Y):
return(np.sqrt(X**2+Y**2))
# 等高线
Z = f(X, Y)
fig, ax = plt.subplots(figsize=(8,8),dpi=100)
# 画contour图
CS = ax.contourf(X, Y, Z)
# 画轮廓线
CS = ax.contour(X, Y, Z)
ax.set_xlabel('$x$'); ax.set_ylabel('$y$')
#设置x,y轴刻度
plt.xticks(np.arange(-10,11,2))
plt.yticks(np.arange(-10,11,2))
# 避免图片显示不完全
plt.tight_layout()
plt.show()
演示图片:
![caa3aac88917268810ddfb7b6219e17e.png](https://i-blog.csdnimg.cn/blog_migrate/8652d932b05f7d2b24f22b4ce3aafe9c.png)
图片中的等高线是系统生成的,我们往往并不想要这样的,我们只想要两个或者三个等高线,那么可以用这个命令:
# 画contour图
CS = ax.contourf(X, Y, Z, 2)
# 画轮廓线
CS = ax.contour(X, Y, Z, 2)
演示如下:
![0d2868823ccc77ba6ba8fdc70b1b83ba.png](https://i-blog.csdnimg.cn/blog_migrate/35ce334cca973295ab55ea5ec0e339bb.jpeg)
需要说明一下, contourf(X, Y, Z, n)这里的n代表要画n+1个等高,2个也就是三个登高。
但是我们往往需要将等高线固定在某个值上,并显示出等高线的值,以及指定颜色,那么可以这样:
# 画contour图
CS = ax.contourf(X, Y, Z, [4,8],colors=['blue','lightsteelblue','white'])
# 画轮廓线
CS = ax.contour(X, Y, Z, [4,8],colors=['blue','lightsteelblue','white'])
plt.clabel(CS,fontsize=10,colors=['red','red','white'])
图片显示如下:
![0d3e62028e337a761174cba21ceb3069.png](https://i-blog.csdnimg.cn/blog_migrate/3da3416385fea493560ced3740bfbcdb.png)
我们在这里注意一下,系统默认画的是等高线为4和等高线为8中间的一部分,有时候我们并不需要,我们需要递减,那么需要增加一个参数:
# 画contour图
CS = ax.contourf(X, Y, Z, [4,8],colors=['blue','lightsteelblue','white'],extend='both')
# 画轮廓线
CS = ax.contour(X, Y, Z, [4,8],colors=['blue','lightsteelblue','white'],extend='both')
plt.clabel(CS,fontsize=10,colors=['red','red','white'])
图片显示如下:
![7eee08fca32ab2fb343a778e0bcba160.png](https://i-blog.csdnimg.cn/blog_migrate/dbf72e5b1e0643568b4fc96e4090ad75.png)
如有错误,欢迎指正!