引言
今天遇到一个问题,对于一幅二维图像,我们该如何在它上面绘制出类似等高线一样的轮廓线,这里特来记录一下
正文
我们需要用到 Matplotlib 库中的 coutour 函数。它的主要参数有三个,X,Y 为二维图像的坐标,Z 对于每个 X,Y 坐标位置上的值。levels 就是我们需要画出的轮廓线有哪些了,colors 对应每部分轮廓线区域的颜色。
示例 1
这里我们以一个简单的轮廓线为例。
x = np.arange(1, 10)
y = np.arange(1, 10)
X, Y = np.meshgrid(x, y)
Z = x * y.reshape(-1, 1)
plt.figure()
cs = plt.contourf(X, Y, Z, levels=[10, 30, 50],
colors=['#808080', '#A0A0A0', '#C0C0C0'], extend='both')
cs.cmap.set_over('red')
cs.cmap.set_under('blue')
cs.changed()
plt.show()
运行后的图像如下图所示:
示例 2
我们以一个对称分布的二维图像为例:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.abs(X) * np.abs(Y)
# 二维面振幅分布图
plt.figure()
plt.imshow(Z, extent=(-1, 1, -1, 1), cmap='viridis')
contour = plt.contour(X, Y, Z, levels=10, colors='white', linewidths=1)
plt.clabel(contour, inline=True, fontsize=8)
plt.show()
这里需要注意的是 ,我们将 levels 设置为 10,这意味着我们会将整个图像区域划分为十个区域,因此我们会得到九条等高线。这里我们为了高对比度,将等高线的颜色设置为了 white。
最重要的一点,在 imshow() 函数中,我们通过设置 extent 参数将二维图像的横纵坐标变为了与等高线横纵坐标范围一致 。
同时,我们通过 plt.clabel(contour, inline=True, fontsize=8) 给每条等高线设置了标记。
示例 3
这里我们以高斯光斑来举例,高斯光斑可以参考这篇------Python 绘制高斯曲面图。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
w0 = 1
gaussian = np.exp(-((pow(X, 2) + pow(Y, 2)) / pow(w0, 2)))
plt.figure()
plt.imshow(gaussian, extent=(-1, 1, -1, 1), cmap='viridis')
plt.colorbar()
contour = plt.contour(X, Y, gaussian, levels=10, colors='white', linewidths=1)
plt.clabel(contour, inline=True, fontsize=8)
plt.show()
这里唯一需要注意的一点是,如果我们在绘制完等高线后再使用 plt.colorbar(),那么添加的 colorbar 就是针对等高线的,这里我们是针对二维图像给出的 colorbar。
如果大家觉得有用,就点个赞让更多的人看到吧~