Toccata in Nowhere.

Python 绘制/拾取 等高线 contour (feat. MATLAB)

2021.07.21

对二维数据绘制等高线(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');

Reference