您的代码中有两个位置用于假设线性图:将点云的中心计算为线性平均值(numpy.mean),并将常数系数(inc)乘以每个点与计算值之间的差值向量中央。
如果你想要视觉证据,尝试在对数图上绘制点云的平均中心的简单练习,它应该看起来偏离中心,偏向顶部和右边。类似地,如果您将点云乘以常数系数并绘制两个版本的图形,您将看不到“更大”云的预期线性膨胀,而是实际上看起来更像是从右上方靠近排水沟的点原始云的一角。
如果在取平均值之前将点转换为对数形式并缩放差异向量,然后在绘图之前将点更改回线性形式,那么您将获得与线性图上看到的结果相同的结果。这可以通过向函数添加额外标志或通过让原始函数返回形状坐标而不是直接绘制它们来实现。后一种情况对我来说似乎更清洁。
例如:
def poly_enclose(…):
….
return patch, edge
log_points = np.log(points)
log_patch, log_edge = poly_enclose(log_points, colors[k], inc=inc, rad=0.3, lw=lw)
lin_patch = np.exp(log_patch)
lin_edge = np.exp(log_edge)
plt.gca().add_patch(lin_patch)
plt.gca().add_patch(lin_edge)
</code>