2015-10-22 26 views
3

当我将matplotlib图形保存为jpeg时,刻度字体被像素化。我不确定发生了什么,或者是否有任何破解可以解决这个问题。有没有人有任何见解?当绘图保存为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

你有没有试过不同的后端?我似乎和'nbagg'一样得到了同样的结果,但使用'Agg'我的jpg看起来好多了。使用'MacOSX'后端,jpg和tiff都有像素化字体 – tom

+0

是的,这似乎有帮助。我摆脱了'%matplotlib nbagg'并添加了'matplotlib.use('webagg')',并且我得到了与png和tiff完全相同的jpg。这将有助于缩小问题范围。 – breeden

+0

@tom,再次感谢。我被卡住了,无法弄清楚该怎么做。你的建议明确指出了我正确的方向。 – breeden

回答

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作为错误。