Python matplotlib:savefig和show之间不一致

Python matplotlib:savefig和show之间不一致,python,matplotlib,Python,Matplotlib,我有一个主图和两个插图(参见下面的代码)。为什么savefig的结果与show()不同?如何使用savefig获得完全相同的效果?我把标签的大小和字体放得比平时大,因为我必须在一篇两栏的文章中插入这个数字,而且尺寸较小,它们不太容易阅读。在我的真实数据中,插图(有点类似于这里)用savefig大幅缩小 提前感谢您的帮助 from numpy import * from pylab import * import matplotlib.pyplot as plt # main fig arr =

我有一个主图和两个插图(参见下面的代码)。为什么savefig的结果与show()不同?如何使用savefig获得完全相同的效果?我把标签的大小和字体放得比平时大,因为我必须在一篇两栏的文章中插入这个数字,而且尺寸较小,它们不太容易阅读。在我的真实数据中,插图(有点类似于这里)用savefig大幅缩小

提前感谢您的帮助

from numpy import *
from pylab import *
import matplotlib.pyplot as plt

# main fig
arr = arange(0.0, 120, 5)
fig = plt.figure()
ax= fig.add_subplot ( 111)
ax.set_xlabel('x test label',  fontsize = 40)
ax.set_ylabel('y test label', fontsize = 40)

plot(arr,arr,'bo-',lw=2,markersize=20,label="test ")
plt.xlim(0,)
plt.tick_params(labelsize=50)
plt.legend(loc='upper left',numpoints=1,bbox_to_anchor=[0.07, 0.95],)

### inset fig
ax = axes([.2, .5, .2, .2], axisbg='y')

data = np.clip(randn(20, 20), -1, 1)

cax = ax.imshow(data, interpolation='nearest', cmap=cm.coolwarm)
ax.set_title('random 1',fontsize=32)
ax.set_xlabel('i', fontsize = 32)
ax.set_ylabel('j', fontsize = 32)

### inset fig
ax = axes([.6, .2, .2, .2], axisbg='y')
data = np.clip(randn(20, 20), -1, 1)
cax = ax.imshow(data, interpolation='nearest', cmap=cm.coolwarm)
ax.set_title('random 2', fontsize=32)

ax.set_xlabel('i', fontsize = 32)
ax.set_ylabel('j', fontsize = 32)

setp(ax, xticks=[], yticks=[])

# arrow
ax.annotate('', xy=(0, 0), xytext=(-10,-5 ),size=20, 
            arrowprops=dict(facecolor='black', shrink=0.02),
            )

plt.savefig('test.pdf', format='pdf', dpi=100)
plt.show()
不幸的是,精确的(低至像素级)结果取决于使用的后端。如果使用不同的后端绘制相同的图像,将得到不同的结果,因为后端在涉及最小细节时有一定的自由度。至少在我的设置中,使用显示后端绘制字体并保存到磁盘时,字体略有不同

您可以通过将相同的图像保存为PNG和PDF来尝试这一点。结果非常接近,但并不完全相同(即光栅化PDF将产生不同的结果)

因此,正如Adobe所建议的那样,您应该对打算使用的后端进行最小的微调


如果您使用光栅输出,那么您可能可以使用Agg后端进行查看和保存,我想结果应该非常接近。如果您使用矢量图形(就像使用PDF一样),那么您可能会尝试同时使用Cairo(
GTKCairo
用于交互)。

至于布局——在show()中,它取决于窗口的大小。所以不,在savefig中不会得到相同的输出。如果您的目标是使用savefig获得结果,请将您的实验限制为仅此一个(因此根本不要使用show()。每一个问题都可能一个接一个地解决。看哪一个添加了一个示例,并添加了一份文档草稿:@tcaswell:很高兴知道这一点。但在我的真实绘图中,我不使用任何插值,savefig的主要问题是改变所有布局(字体、标签、图例大小等)。我并不是真的在寻找一对一的最终像素级。主要问题是savefig彻底改变了一切。我尝试了那些后端选项,但都没有解决问题。目前,我只是将pdf保存在show window中。也许以后会有一个更聪明的解决方案。谢谢你!