当我将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:
这是plot.jpg:
这是plot.tiff:
我认为这与之前的问题有关:Anti-aliased Fonts in Animations
答案 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作为一个错误。