2012-05-23 2 views
2

La plupart des exemples de pyplot utilisent des données linéaires, mais que se passe-t-il si les données sont dispersées?
x = 3,7,9
y = 1,4,5
z = 20,3,7
Scattered x, y, z via matplotlib.pyplot.contourf de python

mieux meshgrid pour contourf
xi = np.linspace(min(x)-1, max(x)+1, 9)
yi = np.linspace(min(y)-1, max(y)+1, 9)
X, Y = np.meshgrid(xi, yi)

Maintenant données "z" ont à interpoler sur la meshgrid.
numpy.interp ne fait peu d'aide ici, alors que les deux linéaire et nn interpolaton de
zi = matplotlib.mlab.griddata(x,y,z,xi,yi,interp="linear") rendements des résultats plutôt étranges

scipy.interpolate.griddatacube de la deuxième réponse a besoin ci-dessous quelque chose d'autre pour renvoyer des données plutôt que nils

Avec les données de niveaux personnalisés devraient être à la recherche quelque chose like this

+2

Quelle est votre question? –

+0

La question est de savoir comment afficher ces données (grille + données) via contourf (couleurs remplies via des niveaux personnalisés, pas de contours), et plus tard appliquer à Basemap mpl_toolkits avec le fichier de forme, mais c'est une autre étape. – dd11

+0

Quel est le peu votre coincé? Vous avez juste besoin d'utiliser des tableaux masqués comme je le décris ci-dessous. Si vous voulez des contours remplis, ajoutez simplement CS2 = plt.contourf (X, Y, Z, 20). – fraxel

Répondre

2

countourf ne fonctionnera qu'avec une grille de données. Si vous êtes données sont dispersées, alors vous aurez besoin pour créer une grille interpolée correspondant à vos données, comme ceci: (notez que vous aurez besoin scipy pour effectuer l'interpolation)

import numpy as np 
from scipy.interpolate import griddata 
import matplotlib.pyplot as plt 
import numpy.ma as ma 
from numpy.random import uniform, seed 

# your data 
x = [3,7,9] 
y = [1,4,5] 
z = [20,3,7] 

# define grid. 
xi = np.linspace(0,10,300) 
yi = np.linspace(0,6,300) 
# grid the data. 
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic') 
# contour the gridded data, plotting dots at the randomly spaced data points. 
CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') 
CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) 
plt.colorbar() # draw colorbar 
# plot data points. 
plt.scatter(x,y,marker='o',c='b',s=5) 
plt.xlim(min(x),max(x)) 
plt.ylim(min(y),max(y)) 
plt.title('griddata test (%d points)' % len(x)) 
plt.show() 

Voir here pour l'origine de ce code.

+0

Vérifions ce que ** numpy.interp ** et encore plus juste pour le cas ** matplotlib.mlab.griddata ** peut faire ici .. – dd11

+0

Même avec des plages fixes xi/yi zi est plein de "nan" et le contour ne montre rien – dd11

+1

Fonctionne pour moi, après avoir réparé la gamme des tableaux. 'xi = np.linspace (0,10,300); yi = np.linspace (0,6,300) '. –

2

Voici ce qui se passe: enter image description here

Bien que contour exige des données sur la grille, nous pouvons caste de données dispersées sur une grille, puis en utilisant masked arrays masque les régions vierges. Je simule ceci dans le code ci-dessous, en créant un tableau aléatoire, puis en l'utilisant pour masquer un ensemble de données de test (montré en bas). La majeure partie du code provient de this matplotlib demo page.

import matplotlib 
import numpy as np 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 

matplotlib.rcParams['xtick.direction'] = 'out' 
matplotlib.rcParams['ytick.direction'] = 'out' 

delta = 0.025 
x = np.arange(-3.0, 3.0, delta) 
y = np.arange(-2.0, 2.0, delta) 
X, Y = np.meshgrid(x, y) 
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
# difference of Gaussians 
Z = 10.0 * (Z2 - Z1) 

from numpy.random import * 
import numpy.ma as ma 

J = random_sample(X.shape) 
mask = J > 0.7 
X = ma.masked_array(X, mask=mask) 
Y = ma.masked_array(Y, mask=mask) 
Z = ma.masked_array(Z, mask=mask) 

plt.figure() 
CS = plt.contour(X, Y, Z, 20) 
plt.clabel(CS, inline=1, fontsize=10) 
plt.title('Simplest default with labels') 
plt.savefig('cat.png') 
plt.show() 

enter image description here

Questions connexes