2012-12-11 9 views
7

Podczas drukowania małych obiektów z łatami w matplotlib, artefakty są wprowadzane ze względu na rozdzielczość wyświetlania. Używanie wygładzania nie rozwiązuje problemu.Artefakty w patchowaniu matplotlib

Czy istnieje rozwiązanie tego problemu?

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

Mam również ten problem. To nie pomoże twojej interaktywnej sesji, ale za to, co jest warte, jeśli zapisujesz obraz w wektoryzowanym formacie, tj. 'Plt.save (" a.pdf ")' wynikowy plik PDF nie cierpi z powodu tych samych artefaktów. – Hooked

+0

Ustawienie 'ec = 'none'' może trochę pomóc:' rect = patches.Rectangle ((x, y), width = 1, height = 1, color =' k ', ec =' none ') ' –

+0

Nie mogłem odtworzyć tego problemu. Zapisane jako png i jako jpg z matplotlib 1.1.1 na OS X, a wynik był w porządku. – tiago

Odpowiedz

3

Dzięki za oddanie razem prosty przykład problemu - to naprawdę sprawia, że ​​śledztwo to o wiele łatwiejsze!

Czy istnieje rozwiązanie tego problemu?

Tak, okazuje się, że jest! Moje początkowe przypuszczenie, po prostu patrząc na obraz, który dołączyłeś, było takie, że działo się dziwne przycinanie/przyciąganie. Po wykluczeniu możliwości antyaliasingu (przez przesuwanie przełącznika, który podałeś) moją jedyną inną drogą testowania było ustawienie słowa kluczowego "przyciąganie" na wartość fałsz (dla bardzo ograniczonych dokumentów w metodzie przyciągania zobacz http://matplotlib.org/api/artist_api.html#matplotlib.artist.Artist.set_snap).

Ustawienie przystawki załatwia sprawę i skończyć z oczekiwanych rezultatów:

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() 

wizualne porównanie (prawdopodobnie najlepszy otwierając zdjęcie w nowym oknie jak przeglądarka prawdopodobnie skalowanie obrazu i wprowadzić dalsze Efekty wizualne):

comparison of the snap property

nie jestem szczególnie wiedzę na temat własności guzikiem w MPL i czy to jest naprawdę pożądane zachowanie, więc będę zadać pytanie na MPL-devel listę mailingową, aby otworzyć rozmowę na temat tego pytania. Mam nadzieję, że ta odpowiedź pomoże ci w międzyczasie.