Python进阶之Matplotlib入门(七)

  • 2019 年 11 月 23 日
  • 笔记

引言

Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技能。对于这个教程,大家最好亲自码一遍代码,这样可以更有收获。

概要

1、掌握Matplotlib中的等高线图画法;

2、掌握Matplotlib中的图像显示用法;

等高线图

等高线图是一种常见的图的类型。

它指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线,并垂直投影到一个水平面上,并按比例缩绘在图纸上,就得到等高线。等高线也可以看作是不同海拔高度的水平面与实际地面的交线,所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔。

今天我们要学习的图例为:

实现上面等高线图的代码:

import numpy as npimport matplotlib.pyplot as plt  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 256x = np.linspace(-3,3,n)y = np.linspace(-3,3,n)X,Y = np.meshgrid(x,y)  plt.contourf(X, Y, f(X,Y), 8, alpha=.75, cmap='jet')C = plt.contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)plt.clabel(C, inline=True, fontsize=10)plt.xticks(())plt.yticks(())  plt.show()

我们先构造一个二维平面“网格”,这里用到了NumPy中的linspace函数,横纵坐标都分成256份。我们用NumPy中的meshgrid函数构造网格。有了网格之后,我们定义f(x,y)函数来作为高度函数。

接下来就是使用画等高线图的三个函数coutourf,contour以及clabel函数:

  • coutourf函数负责填充颜色,其中数字8为等高线的密集程度;alpha为透明度;cmap为颜色风格,它会根据f(x,y)的值不同而选择不同的颜色。具体颜色范围请看这里:

https://matplotlib.org/examples/color/colormaps_reference.html

倒数第三个为我们选择的颜色风格,大家可以尝试别的颜色风格。

仅仅有contourf函数的结果如下:

  • contour函数负责划线,颜色为黑色,效果如下图:
  • clabel函数负责添加等高线对应的高度,inline控制是否将Label画在线里面。

图像显示

现在我们介绍一个叫做imshow的函数,它可以将一个二维数组的值变成颜色打印出来。比如

import matplotlib.pyplot as pltimport numpy as np  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 3x = np.linspace(-3,3,3*n)y = np.linspace(-3,3,3*n)X,Y = np.meshgrid(x,y)plt.imshow(f(X,Y),cmap='bone')plt.colorbar()plt.show()

运行结果:

这个例子中,我们先观察一个9*9数组的结果。其中

  • imshow函数负责打印数组变成图片,cmap我们选择了bone的风格;
  • colorbar函数负责显示右边的颜色棒,上面会显示不同数值对应的颜色,方便大家判断。

最后,我们增大数组的大小,改变camp风格,看一下更加漂亮的结果:

import matplotlib.pyplot as pltimport numpy as np  def f(x,y): return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)  n = 256x = np.linspace(-3,3,3*n)y = np.linspace(-3,3,3*n)X,Y = np.meshgrid(x,y)plt.imshow(f(X,Y),cmap='jet')plt.colorbar()plt.show()

请大家对比imshow和contour画出来的图的异同。