Python 使用path.cleaned删除matplotlib.path中的多余点

Python 使用path.cleaned删除matplotlib.path中的多余点,python,matplotlib,data-cleaning,Python,Matplotlib,Data Cleaning,我试图通过使用来简化matplotlib.path.path的一个实例,即,我希望删除不影响路径形状的点(如doc to中所述)。 我在下面写了一个小例子,它在[0,0.5]上有一个点被删除了,但却生成了另一个点!我还发现了一个解决这个问题的方法,特别是 之前的点是[[0,0],[0,0.5],[0,1],[1,1],[1,0],[0,0]],清洁后的点是[[0,0],[0,1],[1,1],[1,0],[0,0]],第二点和第三点到最后一点是相同的 import matplotlib.pypl

我试图通过使用来简化
matplotlib.path.path
的一个实例,即,我希望删除不影响路径形状的点(如doc to中所述)。 我在下面写了一个小例子,它在
[0,0.5]
上有一个点被删除了,但却生成了另一个点!我还发现了一个解决这个问题的方法,特别是

之前的点是
[[0,0],[0,0.5],[0,1],[1,1],[1,0],[0,0]]
,清洁后的点是
[[0,0],[0,1],[1,1],[1,0],[0,0]]
,第二点和第三点到最后一点是相同的

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as mpatches
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

verts = [[0, 0], [0, 0.5], [0, 1], [1, 1], [1, 0], [0, 0]]
codes = [1, 2, 2, 2, 2, 0]  # use 79 instead of 0 for correctly drawn path border

path = Path(verts, codes)
path.should_simplify = True
cleaned_path = path.cleaned(simplify=True)

patch = mpatches.PathPatch(cleaned_path)
plt.plot(np.asarray(verts)[:, 0], np.asarray(verts)[:, 1], "rx")

ax.add_patch(patch)
plt.show()

我怎样才能解决这个问题?顺便说一句,我使用的是最新的matplotlib版本(2.1.2)。

看看github问题,我不太确定这是否解决了您的问题,以及应该在哪个版本中包含提到的修复程序。同时,您自己删除重复项怎么样:

new_verts = []
new_codes = []
for vert, code in cleaned_path.iter_segments():
    if not new_verts or (np.any(vert != new_verts[-1]) or code != new_codes[-1]):
        new_verts.append(vert)
        new_codes.append(code)

new_path = Path(new_verts, new_codes)

print(new_path.vertices)
这将产生:

[[0. 0.]
 [0. 1.]
 [1. 1.]
 [1. 0.]
 [0. 0.]]

运行代码时,矩形只有三条边是黑色的——这是预期的行为吗?@ThomasKühn当我使用
79
而不是
0
作为
code[-1]
的值时,它将绘制框。我从未真正了解使用这两个值之间的区别,但现在我将继续使用与路径相对应的
79
。我个人会使用路径
Path.LINETO
(=2),因为这感觉最符合逻辑,但根据文档,
Path.CLOSEPOLY
(=79)应该具有相同的效果,在这种情况下,顶点将被忽略。至少对我来说,这两种方法给出了相同的结果。很好的解决方法!不过,一个实际的解决方案(或者至少是导致这种行为的原因)还是不错的。