2012-09-05 17 views
39

Mam tablicę numpy o tym kształcie: (33,10). Kiedy rysuję kontur, otrzymuję brzydki obraz: enter image description hereJak wygładzić kontur konturu matplotlib?

, podczas gdy contour() nie ma żadnych argumentów na temat wygładzania lub jakiejś funkcji interpolacji.

W jakiś sposób spodziewałem się, że narzędzie, które oferuje kontur, powinno również zapewniać wygładzenie.
Czy istnieje prosty sposób na zrobienie tego w MPL?

Odpowiedz

49

Jak inni już wspomniano, trzeba interpolacji danych.

Istnieje wiele różnych sposobów, aby to zrobić, ale na początek rozważ scipy.ndimage.zoom.

Jako szybki exmaple:

import numpy as np 
import scipy.ndimage 
import matplotlib.pyplot as plt 

data = np.loadtxt('data.txt') 

# Resample your data grid by a factor of 3 using cubic spline interpolation. 
data = scipy.ndimage.zoom(data, 3) 

plt.contour(data) 
plt.show() 

enter image description here

+0

Wow! zawsze wymyślasz coś, czego wcześniej nie słyszałem. – imsc

+10

Po prostu spędzam zbyt dużo czasu, próbując sprawić, by moje postacie były tak piękne, jak to tylko możliwe ... Co prawdopodobnie wyjaśnia, dlaczego nigdy nie kończę spraw na czas! :) –

+1

Używałbym [griddata] (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html). – nicoguaro

3

Spróbuj wygładzić swój zestaw danych za pomocą gaussian_filter. Aby uzyskać więcej informacji, patrz example.

+0

Pierwszy przykład dotyczy linii działki i drugie jest dla obrazu, więc żaden ma zastosowanie do konturu działki . A może jestem w błędzie i przytłoczony tym, jak bardzo to się komplikuje? – theta

+0

czy mógłbyś przesłać oryginalny zestaw danych i skrypt podczas publicznego hostingu? – ymn

+0

Oczywiście, tutaj jest to [data.txt] (http://pastebin.com/raw.php?i=ySRym7h7). Na wszelki wypadek, narysuj go za pomocą 'plt.contour (numpy.loadtxt ('data.txt'))' – theta

8

Nie ma łatwego sposobu na uzyskanie gładkiego konturu. Alternatywą jest wypróbowanie imshow. Możesz zobaczyć here dla innych możliwości.

import pylab as plt 
import numpy as np 

Z=np.loadtxt('data.txt') 
plt.subplot(131) 
plt.imshow(Z,interpolation='nearest') 

plt.subplot(132) 
plt.imshow(Z) 

plt.subplot(133) 
plt.imshow(Z,interpolation='gaussian') 

plt.show() 

enter image description here

11

W przypadku, gdy dane są rzadki Joe Kingtons odpowiedź brzmi świetnie.

W przypadku, gdy dane są głośny, należy rozważyć filtrowania zamiast:

from numpy import loadtxt 
from scipy.ndimage.filters import gaussian_filter 
from matplotlib.pyplot import contour, show 

sigma = 0.7 # this depends on how noisy your data is, play with it! 
data = loadtxt('data.txt') 
data = gaussian_filter(data, sigma) 
contour(data) 
show() 

enter image description here

Powiązane problemy