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)应该具有相同的效果,在这种情况下,顶点将被忽略。至少对我来说,这两种方法给出了相同的结果。很好的解决方法!不过,一个实际的解决方案(或者至少是导致这种行为的原因)还是不错的。