我正在尝试使用matplotlib.pyplot根据一系列坐标绘制许多单独的几何图形。我当前的坐标列表包含两个几何,如下所示:
coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]
我想根据重复值将此列表分为多个单独的列表,以创建和绘制封闭的几何图形。当前,这组坐标正确绘制了两个形状,但是它们通过一条线链接在一起。我希望这些是分开的,所以链接它们的线不会画出来。
是否可以拆分此列表,以便在再次达到第一个值(0,-0.31)(即关闭几何图形)时,创建一个新列表,其坐标直到并包括该点?这样可以分离出与闭合形状相关的所有坐标,从而可以进行绘制。
原始坐标列表中可能包含n个几何图形,因此理想情况下,解决方案会将所有这些坐标拆分为单独的坐标对列表,其中第一个和最后一个坐标对相同。
答案 0 :(得分:0)
您可以使用itertools.groupby
:
import itertools
coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]
c = [[a, list(b)] for a, b in itertools.groupby(coords, key=lambda x:x == coords[0])]
new_result = [c[i][-1]+c[i+1][-1] for i in range(0, len(c), 2)]
输出:
[[(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33)], [(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]]
编辑:要查找所有组,可以使用生成器:
def groups(data):
for i, a in enumerate(data):
c = [[a, list(b)] for a, b in itertools.groupby(data[i:], key=lambda x:x == a)]
yield [c[i][-1]+c[i+1][-1] for i in range(0, len(c)-1, 2)]
print(list(groups(coords)))
输出:
[[[(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33)], [(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43)]], [[(2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]], [[(6.73, -0.43), (2.73, -0.43)]], []]
答案 1 :(得分:0)
我将使用自定义生成器:
from itertools import takewhile
coords = [(0.0, -0.31), (2.73, -0.31), (2.73, 0.33), (2.02, 0.95), (1.77, 2.44), (1.39, 4.76), (0.64, 4.76), (0.0, 3.46), (0.0, 0.33), (0.0, -0.31), (2.73, -0.43), (2.73, -3.5), (6.73, -3.5), (6.73, -3.0), (6.73, -2.0), (6.73, -0.43), (2.73, -0.43)]
def coord_list(coords):
coord_iter = iter(coords)
while True:
start = next(coord_iter)
yield [start, *takewhile(lambda x: x != start, coord_iter), start]
list(coord_list(coords))
输出:
[[(0.0, -0.31),
(2.73, -0.31),
(2.73, 0.33),
(2.02, 0.95),
(1.77, 2.44),
(1.39, 4.76),
(0.64, 4.76),
(0.0, 3.46),
(0.0, 0.33),
(0.0, -0.31)],
[(2.73, -0.43),
(2.73, -3.5),
(6.73, -3.5),
(6.73, -3.0),
(6.73, -2.0),
(6.73, -0.43),
(2.73, -0.43)]]