2012-04-06 43 views
6

我通常使用ax.set_rasterized(True)來柵格化圖形,以便在按eps格式保存時可以處理透明度,但是柵格化也會模糊軸標籤和標記標籤,所以有沒有辦法僅在軸內柵格化貼圖而不是整個柵格數字?還是有更好的出口帶有透明度的eps格式?謝謝。如何更好地柵格化繪圖而不會模糊matplotlib中的標籤?

+1

我剛剛發現了set_zorder和set_rasterization_zorder,我認爲它們會有所幫助,但仍然在挖掘文檔,仍然有任何幫助表示讚賞。 – nye17 2012-04-06 21:31:34

+0

你不能使用pdf嗎?它將保持透明度,而不用柵格化。 – Avaris 2012-04-06 21:49:53

+0

@Avaris不幸的是我不能使用pdf,但必須堅持使用eps,所以光柵化似乎是唯一的出路。 – nye17 2012-04-06 22:02:25

回答

7

如matplotlib Artists可以被光柵化,從藝術家(http://matplotlib.sourceforge.net/api/artist_api.html)派生的任何類可以與關鍵字rasterized集到True光柵化。所以你只能柵格化你的補丁。

我只是嘗試了一些組合,它似乎工作。但質量似乎不是很好(另請參閱http://www.mail-archive.com/[email protected]/msg13276.html)。

import numpy as np 
import matplotlib.pyplot as plt 


def add_patch(ax, **kwargs): 
    if 'rasterized' in kwargs and kwargs['rasterized']: 
     ax.set_rasterization_zorder(0) 
    ax.fill_between(np.arange(1, 10), 1, 2, zorder=-1, **kwargs) 
    ax.set_xlim(0, 10) 
    ax.set_ylim(0, 3) 
    if 'alpha' in kwargs and kwargs['alpha'] < 1: 
     txt = 'This patch is transparent!' 
    else: 
     txt = 'This patch is not transparent!' 
    ax.text(5, 1.5, txt, ha='center', va='center', fontsize=25, zorder=-2, 
      rasterized=True) 

fig, axes = plt.subplots(nrows=4, sharex=True) 
add_patch(axes[0], alpha=0.2, rasterized=False) 
add_patch(axes[1], alpha=0.2, rasterized=True) 
add_patch(axes[2], rasterized=False) 
add_patch(axes[3], rasterized=True) 

plt.tight_layout() 
plt.savefig('rasterized_transparency.eps') 

我轉換eps爲PNG,顯示在瀏覽器:

rasterized_transparency.png

參見:How to save figures to pdf as raster images in matplotlib

+0

謝謝,我會嘗試您的示例,並儘快在我自己的代碼上進行測試。答案將被接受,然後;-)。 – nye17 2012-05-14 00:30:29

2

如果您指定dpi - 這似乎默認爲相當低的值,結果會更好。例如,更改最後一行

plt.savefig('rasterized_transparency.eps',dpi=200) 

和文件增長到4.5M,並在Acrobat看起來罰款高達200%的放大倍率。不過,我同意可能有更多的緊湊格式支持透明度。

相關問題