2016-05-04 20 views
0

Ich möchte ein gefülltes Konturdiagramm in ein PDF-Dokument einfügen (z. B. ein TeX-Dokument). Momentan verwende ich pyplot s contourf und speichere pdf mit pyplot s savefig. Das Problem dabei ist, dass die Größe der Diagramme ziemlich groß im Vergleich zu einer hohen Auflösung png wird.Größe des vektorisierten Konturplots verkleinern

Eine Möglichkeit, die Größe zu reduzieren, besteht natürlich darin, die Anzahl der Ebenen in der Grafik zu reduzieren, aber zu wenige Ebenen ergeben eine schlechte Grafik. Ich suche nach einem einfachen Weg, um beispielsweise die Farben des Plots als Png zu speichern, wobei die zu speichernden Achsen, Ticks usw. vektorisiert werden.

+0

Können wir eine typische Handlung sehen? Hast du mit dem Nchunk-Parameter gespielt? –

+0

Das von @tom angegebene Beispiel gibt eine typische Darstellung. Ich habe nicht mit dem Parameter nchunck gespielt, aber für meine Zwecke war die gewählte Antwort ausreichend. Am besten –

Antwort

5

Sie können dies mit der Axes Option set_rasterization_zorder tun.

Alles mit einem zorder weniger als das, was Sie festgelegt werden, wird als gerasterte Grafiken gespeichert, auch beim Speichern in einem Vektorformat wie pdf.

Zum Beispiel:

import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.rand(500,500) 

# fig1 will save the contourf as a vector 
fig1,ax1 = plt.subplots(1) 
ax1.contourf(data) 
fig1.savefig('vector.pdf') 

# fig2 will save the contourf as a raster 
fig2,ax2 = plt.subplots(1) 
ax2.contourf(data,zorder=-20) 
ax2.set_rasterization_zorder(-10) 
fig2.savefig('raster.pdf') 

# Show the difference in file size. "os.stat().st_size" gives the file size in bytes. 
print os.stat('vector.pdf').st_size 
# 15998481 
print os.stat('raster.pdf').st_size 
# 1186334 

Sie this matplotlib example für mehr Hintergrundinformationen sehen.


Wie bereits von @tcaswell aus, nur ein Künstler rastern, ohne seine zorder beeinflussen, die Sie .set_rasterized verwenden können. Dies scheint jedoch keine Option mit contourf zu sein, so dass Sie die PathCollections erstellt von contourf und set_rasterized auf jedem von ihnen durchlaufen müssen. Etwas wie dieses:

contours = ax.contourf(data) 
for pathcoll in contours.collections: 
    pathcoll.set_rasterized(True) 
+0

Große Antwort, danke: D. Für diejenigen, die sich fragen: Künstler mit einer niedrigeren 'zorder' werden zuerst gezeichnet, und Künstler mit einem niedrigeren Wert als dem in' set_rasterization_zorder' werden gerastert. –

+0

Sie können 'set_rasterized' auch für einen Künstler verwenden, um es unabhängig von der Zorder zu rastern. – tacaswell

+1

@tcaswell: Ja, aber nicht alle Künstler haben diese Option. 'contourf' gibt eine' matplotlib.contour.QuadContourSet' Instanz zurück, die nicht die Option 'set_rasterized' besitzt. Sie können die 'PathCollections', die sie in' ax.collections' erstellt, überschleifen und 'set_rasterized' auf jedem von ihnen verwenden, aber ich habe festgestellt, dass 'set_rasterization_zorder' eine einfachere Option ist. – tom

Verwandte Themen