2015-10-22 87 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作爲錯誤。