对二维数据绘制等高线(contour)是一个常见的绘图方法,但同时因为矩阵数据的稀疏性,如果需要获取数据中的等高线信息,一般难以直接使用搜索方法获得。本文介绍Python与MATLAB中绘制与拾取得到等高线数据的方法。
Python
数据准备与绘制背景
这里以一个简单的二维矩阵为例:
import numpy as np
import matplotlib.pyplot as plt
xRange = np.arange(-np.pi, np.pi, 0.05)
yRange = xRange.copy()
gridData = np.zeros((len(xRange), len(yRange)))
for ii, xx in enumerate(xRange):
for jj, yy in enumerate(yRange):
gridData[ii, jj] = np.sin(xx) + np.cos(yy)
使用 plt.pcolor()
函数绘制二维矩阵与边界:
plt.pcolor(xRange, yRange, gridData, cmap='jet')
对于比较大的数据,如果数据步长相同,也可以使用 plt.imshow()
,速度较快,但需要对矩阵在绘图前翻转:
plt.imshow(np.flip(gridData,0),extent=[min(xRange), max(xRange), min(yRange), max(yRange)], cmap='jet')
之后可以绘制 colorbar:
plt.colorbar()
绘制等高线
plt.contour(xRange, yRange, gridData, levels=20, colors='k')
参数 levels
指定绘制多少条等高线,同样也可以传入一个数组,指定需要在什么数值绘制等高线:
plt.contour(xRange, yRange, gridData, levels=[-1.9, 0, 1.9], colors='w')
参数 colors
顾名思义,控制等高线的颜色,如不需指定,则会随着 colormap变化,导致和背景融为一体,无法分辨。
标记等高线数值标签
可以通过获取 plt.contour
函数的返回值得到等高线对象,并绘制等高线标签:
cs = plt.contour(xRange, yRange, gridData, levels=20, colors='k')
plt.clabel(cs, fontsize=9, inline=True)
拾取等高线数值
对于前文得到的 cs
对象,可以直接获取等高线路径值:
contourList = cs.collections[1].get_paths()
将得到一组等高线内所有路径的Path对象的list。
MATLAB
准备数据与绘制背景
clc,clear
xRange = -pi:0.05:pi;
yRange = -pi:0.05:pi;
gridData = zeros(length(xRange));
for ii = 1:length(xRange)
for jj = 1:length(yRange)
gridData(ii,jj) = sin(xRange(ii)) + cos(yRange(jj));
end
end
与 Python 版本一致,简单生成一个二维矩阵供展示。之后使用 pcolor
绘制二维矩阵:
h = pcolor(xRange,yRange, gridData);
set(h,'edgecolor','none');
shading('interp');
colorbar;
hold on,
在绘制后取消了pcolor绘制图形中的网格,并进行插值提升显示效果;之后绘制colorbar。
绘制等高线并添加标记
MATLAB可以直接在绘制等高线的同时添加数值标签文本:
contour(xRange,yRange, gridData, 20, 'ShowText','on', 'color','k');
其中 20 指定了绘制20组等高线,这里同样也可以通过给定数组的方式指定数值绘制等高线:
contour(xRange,yRange, gridData, [-1.9, 0, 1.9], 'ShowText','on', 'color','w');
使用 'ShowText','on',
参数可以直接为等高线添加数值标签,使用 'color','k'
对颜色进行指定(这里标记为黑色)。
拾取等高线数值
MATLAB获取等高线数值的方法可以通过调用 getContourLineCoordinates 脚本函数(需另外下载并添加至路径)直接获取:
[cc, hh] = contour(xRange,yRange, gridData, [-1.9, 0, 1.9], 'ShowText','on', 'color','w');
contourTable = getContourLineCoordinates(hh);
返回值为四列table,分别对应等高线值,等高线组别, x
值与y
值。可以使用 writetable()
函数进行储存:
writetable(contourTable,'contourTable.txt');