2012-04-06 9 views
6

Utilizo ax.set_rasterized(True) para rasterizar la figura para que pueda manejar la transparencia cuando se guarda como en el formato eps, pero la rasterización también difumina las etiquetas del eje y las etiquetas, así que hay una manera de rasterizar solo parches dentro del eje en lugar de ¿figura? o hay una mejor solución para exportar formato eps con transparencia? Gracias.¿Cómo mejorar la trama de una trama sin difuminar las etiquetas en matplotlib?

+1

Acabo de descubrir el set_zorder y set_rasterization_zorder, creo que serían útiles, pero aún se está extrayendo la documentación, aún se agradece cualquier ayuda. – nye17

+0

¿No puedes usar 'pdf'? Preservaría la transparencia sin rasterización. – Avaris

+0

@Avaris. Desafortunadamente no puedo usar el pdf, pero tengo que seguir con los eps, así que la rasterización parece ser la única salida. – nye17

Respuesta

7

Como matplotlib Artists se puede rasterizar, cualquier clase derivada de artista (http://matplotlib.sourceforge.net/api/artist_api.html) se pueden rasterizar con la palabra clave rasterized conjunto a True. Entonces solo puedes rasterizar tus parches.

Acabo de probar algunas combinaciones y parece que funciona. Sin embargo, la calidad no parece ser muy buena (consulte también 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') 

que convierte la eps a PNG para mostrar en el navegador:

rasterized_transparency.png

Consulte también: How to save figures to pdf as raster images in matplotlib.

+0

Gracias, probaré su ejemplo y lo probaré en mis propios códigos lo antes posible. La respuesta será aceptada para entonces ;-). – nye17

2

Los resultados son mejores si especifica ppp, que parece tener un valor por defecto muy bajo. Por ejemplo, cambiar la última línea para

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

y el archivo crece a 4,5 M, y se ve bien en Acrobat hasta un 200% de aumento. Sin embargo, estoy de acuerdo en que probablemente existan formatos más compactos que respalden la transparencia.

Cuestiones relacionadas