我有一个函数,它绘制一段时间内的估计误差(一条线)和该估计的协方差(一个填充区域)。有时估计误差比协方差小几个数量级,因此我将功能设置为自动缩放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()
我认为这是一个错误,但想知道是否有人知道解决方法。为什么会这样? (我想我可以改变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
的错误,而不是观众的错误。