2012-04-06 6 views
6

Normalerweise verwende ich ax.set_rasterized(True), um die Figur so zu rastern, dass sie beim Speichern wie im Format eps mit Transparenz umgehen kann, aber die Rasterung verwischt auch die Achsenbeschriftungen und Strichmarkierungen, also gibt es eine Möglichkeit, nur Patches innerhalb der Achse zu rastern Zahl? Oder gibt es ein besseres Format zum Exportieren von eps-Format mit Transparenz? Vielen Dank.Wie kann man ein Diagramm besser rasterisieren, ohne die Beschriftungen in Matplotlib zu verwischen?

+1

Ich entdeckte gerade die set_zorder und set_rasterization_zorder, ich denke, sie wären hilfreich, aber immer noch graben die Dokumentation, noch wird jede Hilfe geschätzt. – nye17

+0

Kannst du 'pdf' nicht benutzen? Es würde die Transparenz ohne Rasterung erhalten. – Avaris

+0

@Avaris leider kann ich nicht pdf verwenden, aber muss bei eps bleiben, so scheint die Rasterung der einzige Ausweg zu sein. – nye17

Antwort

7

Als matplotlib Artists gerastert werden kann, jede Klasse, die von Künstlern (http://matplotlib.sourceforge.net/api/artist_api.html) kann mit dem Schlüsselwort rasterized Satz True gerastert werden. Sie können also nur Ihre Patches rastern.

Ich habe gerade einige Kombinationen ausprobiert und es scheint zu funktionieren. Die Qualität scheint jedoch nicht sehr gut zu sein (siehe auch 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') 

I umgewandelt, um die eps zu png es im Browser anzuzeigen:

rasterized_transparency.png

Siehe auch: How to save figures to pdf as raster images in matplotlib.

+0

Danke, ich werde Ihr Beispiel ausprobieren und es so schnell wie möglich auf meine eigenen Codes testen lassen. Antwort wird bis dahin angenommen ;-). – nye17

2

Die Ergebnisse sind besser, wenn Sie dpi angeben - das scheint einen ziemlich niedrigen Wert zu haben. Ändern Sie beispielsweise die letzte Zeile zu

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

und die Datei wächst auf 4,5 M und sieht in Acrobat bis zu 200% Vergrößerung in Ordnung. Ich stimme jedoch zu, dass es wahrscheinlich kompaktere Formate gibt, die Transparenz unterstützen.

Verwandte Themen