我有一个主要的图和两个插图(见下面的代码)。为什么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()
答案 0 :(得分:1)
不幸的是,确切的(下降到像素级别)结果取决于所使用的后端。如果使用不同的后端绘制相同的图像,则会得到不同的结果,因为后端在最小的细节方面具有一定的自由度。至少在我的设置中,当使用显示器后端绘制并保存到磁盘时,字体略有不同。
您可以通过将相同的图像保存为PNG和PDF来轻松地尝试此操作。结果非常接近,但它们并不完全相同(即光栅化PDF会产生不同的结果)。
因此,正如Adobe
建议的那样,您应该使用您打算使用的后端进行最小的微调。
如果您使用光栅输出,那么您可以使用Agg后端进行查看和保存,我猜想结果应该非常接近。如果您使用矢量图形(就像使用PDF一样),那么您可以尝试使用Cairo(GTKCairo
进行交互)。