如何从matplotlib中的轮廓中获取坐标?

如何从matplotlib中的轮廓中获取坐标?

在绘制图形时,我们经常需要获取不同元素的具体坐标信息。对于matplotlib绘制的图形,轮廓也是一个重要的元素之一。本文将介绍如何从matplotlib绘制的轮廓中获取坐标信息。

轮廓简介

轮廓是指一个物体在二维平面投影上的边缘线。在matplotlib中,轮廓可以通过contour函数绘制。例如,下面是一个简单的示例代码:

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 - Y**2)

# 绘制轮廓
plt.contour(X, Y, Z, levels=10)
plt.show()

运行这段代码后,会得到一个绘制有10个等高线轮廓的图形

获取轮廓信息

如何从上述图形中提取轮廓上的坐标信息呢?在matplotlib中,我们可以通过collections模块中的QuadContourSet类来实现。该类可以将轮廓图形转换成一系列的闭合路径,每个路径由一组点的坐标构成。我们可以遍历这些路径并获取其坐标信息。

下面是一个简单的示例代码,用于获取轮廓的路径信息:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import collections as mc

# 生成随机数据
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 - Y**2)

# 绘制轮廓
cs = plt.contour(X, Y, Z, levels=10)

# 获取路径信息
paths = []
for i in range(len(cs.collections)):
    paths.extend(cs.collections[i].get_paths())

# 打印第一个路径上的点坐标
path = paths[0]
vertices = path.vertices
print(vertices)

运行这段代码后,会得到第一个路径上的点坐标信息:

[[-1.00009021e+00  5.43898684e-26]
 [-9.48741336e-01  1.15225061e-01]
 [-8.53083765e-01  2.22916456e-01]
 [-7.13926754e-01  3.08414345e-01]
 [-5.38120851e-01  3.68010740e-01]
 [-3.35687218e-01  3.98646187e-01]
 [-1.18578616e-01  3.99422427e-01]
 [ 1.18578616e-01  3.70286183e-01]
 [ 3.35687218e-01  3.11967870e-01]
 [ 5.38120851e-01  2.26836168e-01]
 [ 7.13926754e-01  1.19145379e-01]
 [ 8.53083765e-01  3.01509092e-26]
 [ 9.48741336e-01 -1.15225061e-01]
 [ 1.00009021e+00 -5.43898684e-26]]

在上述代码中,cs.collections属性返回一个含有每个等高线路径的QuadContourSet对象列表。get_paths方法可以获取一个路径集合,并返回一个含有路径Path对象的列表。Path对象中的vertices属性则包含了路径上的点坐标信息。因此我们通过遍历轮廓路径,可以获取到全部路径上的点坐标信息。

可视化路径信息

我们可以将上述获取的路径信息可视化出来,以方便检查和验证。下面是一个示例代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import collections as mc

# 生成随机数据
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 - Y**2)

# 绘制轮廓
cs = plt.contour(X, Y, Z, levels=10)

# 获取路径信息
paths = []
for i in range(len(cs.collections)):
    paths.extend(cs.collections[i].get_paths())

# 可视化路径信息
lc = mc.LineCollection(paths, colors='black', linewidths=2)
fig, ax = plt.subplots()
ax.add_collection(lc)
ax.autoscale()
ax.margins(0.1)

plt.show()

运行上述代码,会得到一个可视化所有路径的图形。

可以看到,这些路径覆盖了整个等高线轮廓,每个路径都由若干个点构成。我们可以通过遍历每个路径,获取其上的所有点,并做进一步处理。

获取所有点的坐标信息

在上述示例代码中,我们已经成功获取了每个路径上的点坐标信息。然而,这些路径并不是按顺序排列的,它们的点数也不是相等的。如果需要将这些点按顺序排列,并组成一个完整的点集合,则需要进行一些额外的处理。

下面是一个示例代码,用于获取所有点的坐标信息:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import collections as mc

# 生成随机数据
x = np.linspace(-1, 1, 100)
y = np.linspace(-1, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 - Y**2)

# 绘制轮廓
cs = plt.contour(X, Y, Z, levels=10)

# 获取路径信息
paths = []
for i in range(len(cs.collections)):
    paths.extend(cs.collections[i].get_paths())

# 获取所有点的坐标信息
vertices = []
codes = []
for path in paths:
    vertices.extend(path.vertices)
    codes.extend([path.codes] * len(path.vertices))

# 对点进行排序
idx = np.argsort(codes)
vertices = np.array(vertices)
vertices = vertices[idx]

# 可视化所有点
plt.plot(vertices[:, 0], vertices[:, 1], 'ro')
plt.show()

首先,我们按照路径的顺序,将每个路径上的点信息拼接成一个大的点集合。然后,我们将路径编码codes也按点的顺序排列,并使用argsort函数获取其排序后的索引。最后,根据排序后的索引,将所有点按顺序排列。

运行上述代码,可以可视化出所有的点坐标。

结论

通过上面的方法,我们可以很方便地从matplotlib绘制的轮廓图中获取点坐标信息。这些信息可以用于后续的分析或处理,例如在图像上标注某个点的坐标信息。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程