2013-04-04 6 views
5

Ich erstelle ein Konturdiagramm mit der Funktion matplotlib.pyplot.contourf(). Die Argumente in dem Aufruf der Funktion sind:Aliasing beim Speichern von mit matplotlib gefülltem Konturplot auf .pdf oder .eps

contourf(xvec,xvec,w,levels,cmap=matplotlib.cm.jet) 

wo

xvec = numpy.linspace(-3.,3.,50) 
levels = numpy.linspace(-0.01,0.25,100) 

und w sind meine Daten.

Die resultierende Grafik sieht auf dem Bildschirm ziemlich gut aus, aber wenn ich mit einem Aufruf von matplotlib.pyplot.savefig() nach pdf speichere, hat das resultierende PDF viel Aliasing (ich denke, das ist was es ist) . Der Aufruf von savefig ist einfach savefig('filename.pdf'). Ich habe versucht, das Argument dpi zu verwenden, aber ohne Glück. Ein Anruf an matplotlib.get_backend() spuckt 'TkAgg' aus.

werde ich eine Figur gespeichert als PDF anhängen, im Vergleich zu einer Figur als png gespeichert (ähnlich, wie es auf dem Bildschirm aussieht), das Problem zu demonstrieren:

png wihtout Aliasing: https://dl.dropbox.com/u/6042643/wigner_g0.17.png

pdf mit Aliasing: https://dl.dropbox.com/u/6042643/wigner_g0.17.pdf

Bitte lassen Sie mich wissen, wenn es andere Details gibt, die ich geben könnte, um Ihnen zu helfen, eine Antwort zu geben. Ich sollte erwähnen, dass das Speichern von .eps zu ähnlich schlechten Ergebnissen führt wie das Speichern im PDF-Format. Aber das PDF zeigt das Problem noch deutlicher. Mein Ziel ist es, eine Produktionsqualität zu erreichen, die ich an ein Latex-Dokument anhängen kann, um es als wissenschaftliche Arbeit zu veröffentlichen. Ich wäre glücklich mit einer Art von Arbeit um, wo ich in einem Format speichern, dann konvertieren, wenn ich einen Weg finden kann, der befriedigende Ergebnisse gibt.

Best,

Arne

+0

Diejenigen aussehen [Moiré-Muster] (https://en.wikipedia.org/wiki/Moir%C3%A9_pattern) zu mir. Mit der PDF ändert sich das Muster basierend auf der Zoomstufe. – tacaswell

+2

@arne: Die verknüpften Dateien sind weg - jede Chance, sie zu ersetzen? –

Antwort

5

Nachdem ich eine Weile mit der nützlichen Antwort von @pelson gearbeitet hatte, fand ich endlich eine passende Lösung für dieses langanhaltende Problem (derzeit in Matplotlib 2.0), das keine Mehrfachaufrufe zum Konturieren oder Rastern der Figur erfordert.

Ich verweise auf meine ursprüngliche Antwort here für eine ausführlichere Erklärung und Beispiele.

Zusammengefasst besteht die Lösung aus den folgenden Zeilen:

cnt = plt.contourf(x, y, z) 

for c in cnt.collections: 
    c.set_edgecolor("face") 

plt.savefig('test.pdf') 
6

hatte ich keine Ahnung, dass war so schlecht, im PDF-Konturierung. Du hast recht, ich denke, die Konturen werden von den PDF-Renderern außerhalb von Matplotlib geglättet. Aus diesem Grund denke ich, dass Sie besonders vorsichtig sein müssen, welche Anwendung Sie verwenden, um das resultierende PDF zu sehen - das beste Verhalten, das ich gesehen habe, ist mit GIMP, aber ich bin sicher, es gibt viele andere Zuschauer, die gut funktionieren.

um dieses Problem zu beheben (wenn das PDF mit GIMP sehen), konnte ich „Rastern“, die mit matplotlib erzeugten Konturen das hässliche weiße Linie Problem zu vermeiden:

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

# Rasterize the contour collections 
for c in cs.collections: 
    c.set_rasterized(True) 

plt.savefig('test.pdf') 

Dies ein Konturdiagramm erzeugt, zeigte nicht die Probleme, die Sie gezeigt haben.

Eine andere Alternative, vielleicht besser, Ansatz wäre, das Anti-Aliasing zu täuschen, indem Sie farbige Linien unter die Kontur legen.

import matplotlib.pyplot as plt 
import numpy as np 


xs, ys = np.mgrid[0:30, 0:40] 
data = (xs - 15) ** 2 + (ys - 20) ** 2 + (np.sin(ys) + 10) ** 2 

# contour the plot first to remove any AA artifacts 
plt.contour(xs, ys, data, 60, cmap='jet', lw=0.1) 
cs = plt.contourf(xs, ys, data, 60, cmap='jet') 

plt.savefig('test.pdf') 

ich darauf hingewiesen, dass ich diese Probleme nicht sehen, ob ich die Figur als „.ps“ eher als ein „.pdf“ speichern - vielleicht, dass eine dritte Alternative ist.

Hoffe das hilft Ihnen das Papier genau so zu bekommen, wie Sie es wollen.

+1

Hallo Pelson. Ich habe mich für deine zweite Lösung entschieden, und es hat wirklich gut funktioniert. Danke vielmals. – arne

+0

Ich kann dieses Verhalten auch bestätigen, wenn ich 'contourf()' mit Ebenen entweder in PS, EPS, PDF, aber nicht in SVG-Ausgabe speichere. Auch das Ausführen dieser Art von PS/EPS/PDF über GhostScript und die Ausgabe von zB PNG mit 300dpi, zeigt kein Problem, aber PDF in Acrobat, SumatraPDF (verwendet mupdf engine, von gleichen Leuten hinter GhostScript), CorelDraw, Ipe, .. Alle zeigen dieses Artefakt als sichtbar an. – theta

+0

Mehr in, es ist nicht, dass Konturen Konturen haben, aber es gibt kleine Lücke zwischen Konturen und weißem Hintergrund des Plot-Fensters ist, was als Kontur Umriss zeigt. – theta