Python matplotlib等高线图中的闭合线

Python matplotlib等高线图中的闭合线,python,pdf,matplotlib,contour,Python,Pdf,Matplotlib,Contour,当仔细观察使用matplotlib绘制的等高线图时,我注意到较小的等高线具有不准确的端点,这些端点在PDF图形中无法完美闭合。考虑最小的例子: 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)) plt.savefig("test.pdf") 生成的test.pdf文件的中心部分(如下所

当仔细观察使用matplotlib绘制的等高线图时,我注意到较小的等高线具有不准确的端点,这些端点在PDF图形中无法完美闭合。考虑最小的例子:

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))
plt.savefig("test.pdf")
生成的test.pdf文件的中心部分(如下所示)清楚地显示了问题。有没有办法解决这个问题,或者这是matploplib的错误/内在不准确


所以我做了同样的事情,但是得到了闭合的轮廓(见图)。你检查过软件包的更新了吗

import matplotlib.pyplot as plt
import numpy as np

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))
plt.show()


免责声明:这与其说是一个真实的答案,不如说是一个解释+hack

我认为matplotlib绘制等高线图的方式存在一个根本问题。本质上,所有等高线都是线的集合(
LineCollection
),而它们应该是可能闭合线的集合(
PolyCollection
)。这样做可能有很好的理由,但在这个简单的例子中,我做出了这个选择,显然产生了工件。一个不太好的解决方案是将后验all
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.collections导入PolyCollection
eps=1e-5
plt.gca().set_aspect('equal'))
x、 y=np.meshgrid(np.linspace(-1,1100),np.linspace(-1,1100))
r=x*x+y*y
等高线平面图(np.log(r/1.2))
ca=plt.gca()
N=len(约个集合)
对于范围内的n(n):
c=ca.collections.pop(0)
对于c中的s。获取_段():
闭合=(abs(s[0,0]-s[-1,0])
对获得的结果进行缩放显示,现在一切正常:


检查轮廓是否闭合需要特别小心:在当前代码中,这是通过对第一个和最后一个点进行近似相等检查来完成的:我想知道是否有更好的方法来执行此操作(也许matplotlib会返回一些数据来检查闭合轮廓?)。在任何情况下,这都是hack:我很高兴听到是否有人有更好的解决方案(或者有办法在matplotlib中解决这个问题)。

您不是在制作PDF,这是最简单的示例的一部分。试着制作一个PDF文件,然后用你的PDF查看器缩放它的中心区域,告诉我你是否仍然看到闭合的轮廓。虽然这不是一个完美的解决方案,但我发现当我光栅化时,间隙变得明显更小。光栅化不是很好:PDF图形的优点是它们允许矢量图形,当我缩放它时(至少在原则上)缩放得非常好。我使用matplotlib 1.5.3得到了相同的结果。@AngusWilliams感谢您的仔细检查。