2012-12-11 14 views
7

Beim Plotten kleiner Patch-Objekte in Matplotlib werden aufgrund der Bildschirmauflösung Artefakte eingeführt. Die Verwendung von Anti-Aliasing löst das Problem nicht.Artefakte beim Matplotlib-Patch-Plotten

Gibt es eine Lösung für dieses Problem?

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

ax = plt.axes() 

for x in range(-10,11): 
    for y in range(-10,11): 
     rect = patches.Rectangle((x, y), width=0.1, height=0.1, color='k',aa=True) 
     ax.add_patch(rect) 

plt.xlim([-30, 30]) 
plt.ylim([-30, 30]) 
plt.show() 

output

+1

Ich hatte dieses Problem auch. Dies hilft nicht bei Ihrer interaktiven Sitzung, aber für das, was es wert ist, wenn Sie das Bild in einem vektorisierten Format speichern, d. H. "Plt.save (" a.pdf ")" leidet die resultierende PDF nicht unter den gleichen Artefakten. – Hooked

+0

Das Setzen von 'ec = 'none' könnte etwas helfen:' rect = patches.Rectangle ((x, y), Breite = 1, Höhe = 1, color =' k ', ec =' none ') ' –

+0

Ich konnte dieses Problem nicht reproduzieren. Gespeichert als png und als jpg mit matplotlib 1.1.1 unter OS X, und das Ergebnis war in Ordnung. – tiago

Antwort

3

Dank für die Umsetzung ein einfaches Beispiel für das Problem zusammen - es macht wirklich so viel einfacher zu untersuchen!

Gibt es eine Lösung für dieses Problem?

Ja, es stellt sich heraus, gibt es! Meine erste Vermutung war, dass, wenn man nur das Bild anschaut, das man anbrachte, ein seltsames Clipping/Snapping vor sich ging. Nachdem ich die Antialiasing-Möglichkeit ausgeschlossen hatte (indem ich den von Ihnen bereitgestellten Schalter gedrückt habe), bestand meine einzige andere Möglichkeit darin, das Schlüsselwort "snap" auf false zu setzen (für die sehr eingeschränkten Dokumente der Snap-Methode siehe http://matplotlib.org/api/artist_api.html#matplotlib.artist.Artist.set_snap).

das Snap Einstellung funktioniert der Trick und Sie mit den erwarteten Ergebnissen am Ende:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

ax = plt.axes() 

for x in range(-10,11): 
    for y in range(-10,11): 
     rect = patches.Rectangle((x, y), width=0.1, height=0.1, 
           color='k', snap=False) 
     ax.add_patch(rect) 

plt.xlim([-30, 30]) 
plt.ylim([-30, 30]) 
plt.show() 

Ein visueller Vergleich (wahrscheinlich am besten das Bild in einem neuen Fenster geöffnet wird, wie Ihr Browser wahrscheinlich das Bild skaliert und einführen weiter visuelle Effekte):

comparison of the snap property

ich bin nicht besonders gut informiert über die Snap-Eigenschaft in mpl und ob dies wirklich wünschenswert Verhalten, also werde ich eine Frage auf dem mpl-devel posten Mailingliste, um ein Gespräch über diese Frage zu eröffnen. Hoffentlich wird Ihnen diese Antwort in der Zwischenzeit helfen.