matplotlib:savefig与show不一致
我有一个主图和两个插图(下面的代码可以参考)。为什么用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()
1 个回答
1
很遗憾,最终的结果(甚至到像素级别)会根据你使用的后端而有所不同。如果你用不同的后端绘制同样的图像,结果会不一样,因为后端在处理一些细节时有一定的自由度。至少在我的设置中,用显示后端绘制的字体和保存到磁盘的字体稍微有些不同。
你可以很简单地尝试一下,保存同一张图片为PNG格式和PDF格式。结果会非常接近,但并不是完全一样的(也就是说,把PDF转换成位图时会产生不同的结果)。
所以,正如Adobe
所建议的,你应该在你打算使用的后端上进行最小的微调。
如果你使用的是位图输出,那么你可以尝试在查看和保存时都使用Agg后端,这样结果应该会非常接近。我想,如果你使用的是矢量图形(就像使用PDF时那样),那么你可以尝试同时使用Cairo(GTKCairo
用于交互)。