使用fill_between和backend_pdf并关闭自动缩放时的工件

时间:2017-10-05 15:47:53

标签: python linux pdf matplotlib

我有一个函数,它绘制一段时间内的估计误差(一条线)和该估计的协方差(一个填充区域)。有时估计误差比协方差小几个数量级,因此我将功能设置为自动缩放y限制以强调估计误差。

当我使用plt.show()将其绘制到屏幕上时,该功能正常工作,但是当我尝试使用matplotlib的backend_pdf模块将其绘制为PDF时,我会得到奇怪的视觉效果。

这是一个最低限度的工作示例:

import numpy as np
import matplotlib.backends.backend_pdf as plt_pdf
import matplotlib.pyplot as plt

P =      np.array([  1.00000000e+00,   1.13438020e-02,   7.09875882e-03,
                     5.22532652e-03,   3.98620107e-03,   3.16986671e-03,
                     2.61435852e-03,   2.21858461e-03,   1.92450926e-03,
                     1.69821798e-03,   1.51903818e-03,   1.37380019e-03,
                     1.25377026e-03,   1.15294938e-03,   1.06708988e-03,
                     9.93104161e-04,   9.28696130e-04,   8.72123940e-04,
                     8.22042891e-04,   7.77398690e-04,   7.37353271e-04,
                     7.01232187e-04,   6.68486622e-04,   6.38665488e-04,
                     6.11394634e-04,   5.86361140e-04,   5.63301300e-04,
                     5.41991330e-04,   5.22240095e-04,   5.03883377e-04,
                     4.86779303e-04,   4.70804678e-04,   4.55852012e-04,
                     4.41827103e-04,   4.28647046e-04,   4.16238597e-04,
                     4.04536807e-04,   3.93483885e-04,   3.83028239e-04,
                     3.73123673e-04,   3.63728701e-04,   3.54805964e-04,
                     3.46321733e-04,   3.38245478e-04,   3.30549503e-04,
                     3.23208626e-04,   3.16199899e-04,   3.09502370e-04,
                     3.03096873e-04,   2.96965838e-04,   2.91093134e-04,
                     2.85463925e-04,   2.80064539e-04,   2.74882362e-04,
                     2.69905735e-04,   2.65123865e-04,   2.60526748e-04,
                     2.56105095e-04,   2.51850271e-04,   2.47754238e-04,
                     2.43809500e-04,   2.40009062e-04,   2.36346383e-04,
                     2.32815343e-04,   2.29410201e-04,   2.26125572e-04])
x = np.ones(P.shape) * 1e-13
t = np.arange(0,x.shape[0])

pdf = plt_pdf.PdfPages('plot_mwe.pdf')
fig = plt.figure()
ax  = fig.add_subplot(111)
ax.fill_between(t, P, -P)
ax.plot(t, x, c='black')
ax.set_ylim(bottom = -1.5e-13, top = 1.5e-13, auto = False)

pdf.savefig(fig)
pdf.close()

plt.show()

此代码生成以下pdf:
plot_mwe backend_pdf

但是,我期望看到的是这一个:
plot_mwe pyplot

我认为这是一个错误,但想知道是否有人知道解决方法。为什么会这样? (我想我可以改变P的值,以便它们完美地符合情节ylimits,但这让我感到紧张,因为它引入了新的错误来源。)

更新:人们评论说,这在Windows中并不会发生。我尝试过Atril和Evince(两个Linux PDF查看器),两者都是一样的。我的系统是Linux axiom-dev 4.4.0-38-generic #57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

更新#2:生成的PDF在多个操作系统上存在问题。下面你可以看到Mac的内置预览应用程序在页面缩略图中呈现fill_between区域,但不在页面本身上。这似乎是backend_pdf的错误,而不是观众的错误。

Mac Preview also struggles with the generated PDF.

0 个答案:

没有答案