当绘图保存为jpeg时,像素化字体

时间:2015-10-22 14:17:53

标签: python matplotlib python-imaging-library

当我将matplotlib图形保存为jpeg时,刻度字体会像素化。我不确定发生了什么,或者是否有任何黑客可以解决这个问题。有没有人有任何见解?

%matplotlib nbagg

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1.2,1.2,1000,endpoint=True)
y = np.copy(x)

x,y = np.meshgrid(x,y)
z   = -x**2 + y**2 - y**3

fig = plt.figure()

ax  = fig.add_subplot(111)

CS = plt.contour(x,y,z, [0,-0.1,0.1], colors=['black','blue', 'gray'])
plt.clabel(CS, fontsize=14, inline=1, fmt='%1.1f', manual=[(-0.15,0), (-0.4,0), (0.25,0.5)])

plt.savefig('plot.png', format='png')
plt.savefig('plot.jpg', format='jpg')
plt.savefig('plot.tiff', format='tiff')

这是plot.png:

enter image description here

这是plot.jpg:

enter image description here

这是plot.tiff:

enter image description here

我认为这与之前的问题有关:Anti-aliased Fonts in Animations

1 个答案:

答案 0 :(得分:2)

如上所述,出现这种情况取决于所使用的后端。您可以使用以下方法来避免此问题:

import matplotlib
matplotlib.use('webagg')

而不是:

%matplotlib nbagg

我认为这个问题与PIL试图保存一个透明的数字jpeg有关。如果你坚持使用nbagg,看来如果你设置:

matplotlib.rcParams['nbagg.transparent'] = False

您的jpeg图像字体不会像素化,看起来几乎与问题中显示的png和tiff文件相同。不幸的是使用rcParams:

matplotlib.rcParams['savefig.transparent'] = False

还不够。似乎'savefig.transparent'rcParam将控制图中图形的透明度,'nbagg.transparent'将控制图形外的透明度(即:轴,刻度,标题等)。当保存到不支持透明度的文件格式时,确保后端强制透明度= False可能很容易。

其他一些后端可能不支持透明度,这就是为什么它在您更改后端时似乎可以解决问题。

我会将此报告给github作为一个错误。