【问题标题】:Closed lines in matplotlib contour plotsmatplotlib 等高线图中的闭合线
【发布时间】:2017-02-15 18:31:28
【问题描述】:

当仔细查看使用 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 的错误/内在不准确?

【问题讨论】:

  • 我使用 matplotlib 1.5.3 得到了相同的结果。
  • @AngusWilliams 感谢您的仔细检查。

标签: python pdf matplotlib contour


【解决方案1】:

所以我只是做了同样的事情,但得到了封闭的轮廓(见图)。您是否检查过软件包的任何更新?

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

【讨论】:

  • 您不是在制作 PDF,这是最小示例的一部分。试着制作一个 PDF 文件,然后用你的 PDF 查看器缩放它的中心区域,如果你仍然看到闭合的轮廓,请告诉我。
  • 虽然不是一个完美的解决方案,但我发现当我光栅化时,间隙变得明显更小了。 stackoverflow.com/questions/12098331/…astrobetter.com/blog/2014/01/17/slim-down-your-bloated-graphics
  • 光栅化不是很好:PDF 图形的好处是它们允许矢量图形,当我缩放它时(至少在原则上)缩放得很好。
【解决方案2】:

免责声明:这更像是一个解释 + 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 中解决这个问题)。

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多