matplotlib等高线图中的闭合线

时间:2016-10-06 21:12:00

标签: 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文件的中心部分(如下所示)清楚地显示了问题。有没有办法解决这个问题,还是matploplib的错误/内在错误?

enter image description here

2 个答案:

答案 0 :(得分:4)

免责声明:这是一个解释+黑客而不是真正的答案。

我相信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")

获得的结果的缩放显示现在一切正常:

enter image description here

需要注意检查一个轮廓是否已关闭:在本代码中,这是通过对第一个和最后一个点进行近似等式检查来完成的:如果有更好的方法可以徘徊(也许是matplotlib)返回一些数据来检查闭合轮廓?)。无论如何,这也是黑客攻击:我很高兴听到有人有更好的解决方案(或者有办法在matplotlib中解决这个问题)。

答案 1 :(得分:0)

所以我做了同样的事情,但得到了封闭的轮廓(见图片)。你有没有检查包装上的任何更新?

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()

Zoomed Out

Zoomed In