Python 图形的绘制轮廓线

Python 图形的绘制轮廓线

引言

今天遇到一个问题,对于一幅二维图像,我们该如何在它上面绘制出类似等高线一样的轮廓线,这里特来记录一下

正文

我们需要用到 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。

如果大家觉得有用,就点个赞让更多的人看到吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值