2012-09-05 32 views
39

Tengo numpy array con esta forma: (33,10). Cuando gráfico de contorno consigo fea imagen como esta: enter image description hereCómo suavizar la trama del contorno de matplotlib?

mientras contour() no parecen tener ningún argumento acerca de suavizar o algún tipo de función de interpolación.

De alguna manera esperaba que la herramienta que ofrece la gráfica de contorno también ofrezca suavizado.
¿Hay una manera directa de hacerlo en MPL?

Respuesta

49

Como otros ya han señalado, es necesario interpolar los datos.

Hay varias maneras diferentes de hacerlo, pero para empezar, considere scipy.ndimage.zoom.

Como exmaple rápida:

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

¡Guau! siempre se te ocurre algo que no he escuchado antes. – imsc

+10

Solo paso demasiado tiempo tratando de hacer que mis figuras sean lo más bonitas posible ... ¡Lo que probablemente explica por qué nunca termino las cosas a tiempo! :) –

+1

Usaría [griddata] (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html). – nicoguaro

3

Trate de suavizar su conjunto de datos con un gaussian_filter. Vea example para más información.

+0

primer ejemplo es para diagrama de puntos y el segundo es para una imagen, por lo que ninguno es aplicable para el contorno de trama . ¿O tal vez estoy equivocado y abrumado por lo complicado que resulta ser esto? – theta

+0

¿podría usted cargar el conjunto de datos original y su secuencia de comandos en el alojamiento público? – ymn

+0

Claro, aquí está [data.txt] (http://pastebin.com/raw.php?i=ySRym7h7). Por si acaso, trazarlo con 'plt.contour (numpy.loadtxt ('data.txt'))' – theta

8

No hay una manera fácil de obtener un contorno suave. Una alternativa es intentar imshow. Puede mirar here para otras posibilidades.

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

En caso de que sus datos son escasos , Joe Kingtons respuesta es grande.

En caso de que sus datos es ruidosa, se debe considerar la filtra en su lugar:

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

Cuestiones relacionadas