2012-12-25 17 views
6

Für einen Artikel erzeuge ich Diagramme von verformten Finite-Elemente-Netzen, die ich mit der Polykollektion von matplotlib visualisiere. Die Bilder werden als PDF gespeichert.rasterizing matplotlib axis contents (aber nicht frame, labels)

Probleme entstehen für Netze mit hoher Dichte, für die der naive Ansatz zu Dateien führt, die zu groß und zu intensiv sind, um praktisch zu sein.

Für diese Netze macht es wirklich keinen Sinn, jedes Element als Polygon darzustellen; Es könnte leicht gerastert werden, wie es beim Speichern des Bildes als jpg oder png geschieht. Für den Druck möchte ich jedoch einen scharfen Rahmen, Beschriftungen und Anmerkungen beibehalten.

Weiß jemand, ob es möglich ist, diese Art der Hybrid-Rasterung in Matplotlib zu erreichen?

Ich kann mir Lösungen vorstellen, die imshow beinhalten und Polykollektion umgehen, aber ich würde viel lieber matplotlibs eingebaute Komponenten verwenden.

Vielen Dank für Ihren Rat.

Antwort

9

Übergeben Sie einfach das Schlüsselwort rasterized=True an Ihren Sammlungskonstruktor. Beispiel:

col = collections.PolyCollection(<arguments>, rasterized=True) 

Dies ist nur ein selektives Rasterung dieses Elements erlaubt (zum Beispiel, wenn Sie eine normale Handlung auf es täten, würde es standardmäßig vektorisiert werden). Die meisten Befehle wie plot oder imshow können auch das Schlüsselwort rasterized übernehmen. Will man die ganze Figur (einschließlich Etiketten und Anmerkungen) rastern, dies würde es tun:

fig = plt.figure() 
a = fig.add_subplot(1,1,1, rasterized=True) 

(Aber das ist nicht das, was Sie wollen, wie in der Frage angegeben.)

+0

Wow, so einfach . Ich mache mir jetzt Sorgen um meine Googling-Fähigkeiten. Aber vielen Dank für diese Antwort, genau das habe ich mir erhofft! – gertjan

+0

Das ist großartig! Irgendeine Idee, wie man die dpi der Rasterung jedoch kontrolliert? Es scheint die dpi zu ignorieren, die ich an 'figure' und' savefig' übergebe ... – weronika

+0

@weronika, wenn die dpi in 'figure' oder' savefig' nicht funktioniert, dann weiß ich nicht wirklich wie ich es ändern soll . 'Sammlungen' scheint den Künstler' allow_rasterization' Dekorateur zu verwenden, aber von einem schnellen Blick auf den Code konnte ich nicht sehen, wie man eine dpi einstellt. – tiago