繁体   English   中英

matplotlib:savefig和show之间不一致

[英]matplotlib: inconsistency between savefig and 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()

不幸的是,确切的结果(下降到像素级别)取决于所使用的后端。 如果使用不同的后端绘制相同的图像,则会得到不同的结果,因为在涉及最小的细节时,后端具有一定的自由度。 至少在我的设置中,使用显示后端绘制并保存到磁盘时,字体略有不同。

您可以通过将同一图像另存为PNG和PDF来轻松尝试。 结果彼此非常接近,但是它们并不完全相同(即光栅化PDF将产生不同的结果)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM