python - matplotlib 等高线图中的闭合线

标签 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

最佳答案

免责声明:这与其说是真正的答案,不如说是解释 + 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")

放大得到的结果显示现在一切正常:

enter image description here

需要注意检查轮廓是否闭合:在目前的代码中,这是通过对第一点和最后一点进行近似相等检查来完成的:我在想是否有更好的方法来做到这一点(也许是 matplotlib返回一些数据来检查闭合轮廓?)。无论如何,这又是 hack:如果有人有更好的解决方案(或者有办法在 matplotlib 中解决这个问题),我会很高兴听到。

关于python - matplotlib 等高线图中的闭合线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39905702/

相关文章:

python - Matplotlib 默认设置小刻度 "ON"

python - 如何从 Pandas 数据框中绘制直方图

python - python 中的 XOR 交换算法?

ios - 如何获得没有锯齿的 iOS 矢量图像?

c# - 通过 SDK 在 Adob​​e Acrobat 中比较 PDF 文档

javascript - 使用客户端 JavaScript 将文件附加到 PDF?

python - 在 Python 中从网络流创建数组

python - 为什么我的轮廓没有关闭(Python,OpenCV)?

python - 通过更改成员在 python 中进行缓存

python - 在 pyplot 的顶部和底部添加填充