如何从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绘制的轮廓图中获取点坐标信息。这些信息可以用于后续的分析或处理,例如在图像上标注某个点的坐标信息。