我们经常在二维图上用等高线来表示三维数据,Matplotlib提供了三个函数来实现这一功能:
def f(x, y): return np.sin(x)**10 + np.cos(10 +y*x)*np.cos(x) x = np.linspace(0,5,50) y = np.linspace(0,5,40) X, Y = np.meshgrid(x, y) # 使用两个一维数组构建一个二维数组 Z = f(X, Y) plt.contour(X, Y, Z, colors='blue')
contour函数需要三个基本参数:x、y、z轴三个坐标轴的网格数据。x与y轴表示图形中的位置,而z轴通过等高线的等级来表示。
当图形中只使用一种颜色的时候,会使用虚线来表示负数,实线表示正数。
我们可以将数据范围等分,比如10份,然后设置camp参数定义一个线条颜色的配色方案,用不同的颜色表示等高线。
plt.contour(X, Y, Z, cmap='RdGy') plt.colorbar()
RdGy
是红-灰
配色方案(Red-Gray)。Matplotlib有很多配色方案可选,都在plt.cm模块里,使用plt.cm.<tab>
可以查看有哪些方案。
上面的图形里,线条之间的间隙比较大,可以通过contourf方法进行填充(注意方法名多了个f):
plt.contourf(X, Y, Z, cmap='RdGy') plt.colorbar()
我们还可以通过imshow方法,将二维数组渲染成渐变图:
plt.imshow(Z, extent=[0,5,0,5], origin='lower',cmap='RdGy') plt.colorbar() plt.axis(aspect='image')
xmin、xmax,ymin、ymax
plt.axis(aspect='image')
来设置x与y轴的单位。最后,我们还可以使用clabel方法,将一幅背景半透明的彩色图与另一幅坐标相同、带数据标签的等高线叠放在一起,画出相当高端的图形:
contours = plt.contour(X,Y,Z,3,colors='black') # 分3级 plt.clabel(contours,inline=True, fontsize=8) # 内部带数值文字 plt.imshow(Z, extent=[0,5,0,5], origin='lower',cmap='RdGy', alpha=0.5) plt.colorbar()
现在你或许会有感悟,绘图画到最后,缺少的不是工具,而是创意灵感。