免责声明:这更像是一个解释 + hack,而不是真正的答案。
我认为 matplotlib 制作等高线图的方式存在一个根本问题。本质上,所有轮廓都是线条的集合(LineCollection),而它们应该是可能闭合的线条的集合(PolyCollection)。这样做可能有很好的理由,但在这个简单的例子中,我做出这个选择显然会产生工件。一个不太好的解决方案是将所有LineCollection 的后验转换为PolyCollection。这是在下面的代码中完成的
from matplotlib.collections import PolyCollection
eps = 1e-5
plt.gca().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-1,1,100), np.linspace(-1,1,100))
r = x*x + y*y
plt.contour(np.log(r/1.2))
ca = plt.gca()
N = len(ca.collections)
for n in range(N):
c = ca.collections.pop(0)
for s in c.get_segments():
closed = (abs(s[0,0] - s[-1,0]) < eps) and (abs(s[0,1] - s[-1,1]) < eps)
p = PolyCollection([s], edgecolors=c.get_edgecolors(),
linewidths=c.get_linewidths(), linestyles=c.get_linestyles(),
facecolors=c.get_facecolors(), closed=closed)
ca.add_collection(p)
plt.savefig("test.pdf")
获得的结果放大显示现在一切正常:
需要注意检查轮廓是否闭合:在当前代码中,这是通过对第一点和最后一点的近似相等检查来完成的:如果有更好的方法来做到这一点,我正在徘徊(也许是 matplotlib返回一些数据来检查闭合轮廓?)。无论如何,这又是 hack:我很高兴听到有人有更好的解决方案(或者有办法在 matplotlib 中解决这个问题)。