Matplotlib contour à partir des données xyz: griddata index non valide
Je suis en train de faire un tracé de contour à l'aide de matplotlib d'un fichier avec le format suivant:
x1 y1 z1
x2 y2 z2
etc
Je peux le charger avec numpy.loadtxt pour obtenir les vecteurs. Jusqu'à présent, aucune difficulté.
J'ai lu ce pour apprendre à tracer, et peuvent se reproduire par copier-coller, donc je suis sûr que rien est le problème avec mon installation:
http://matplotlib.org/examples/pylab_examples/griddata_demo.html
Je comprends pas j'ai de l'entrée x et y en tant que vecteur et z comme un tableau ,ce qui peut être fait avec griddata. C'est aussi ce que je trouve sur ce site.
La documentation dit:
zi = griddata(x,y,z,xi,yi) correspond à une surface de la forme z = f*(*x, y) pour les données de l' (généralement) decompos espacés de vecteurs (x, y, z). griddata() interpole cette surface aux points spécifiés par (xi, yi) pour produire de la zi. xi et yi doit décrire une grille régulière, peut être soit 1D ou 2D, mais doivent être de plus en plus monotone.
Pour le bien de l'exemple, j'ai écrit ce code:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
x=np.linspace(1.,10.,20)
y=np.linspace(1.,10.,20)
z=np.linspace(1.,2.,20)
xi=np.linspace(1.,10.,10)
yi=np.linspace(1.,10.,10)
zi = ml.griddata(x,y,z,xi,yi)
Cependant, j'obtiens l'erreur suivante quand il s'agit de la griddata:
IndexError: index non valide
Donc, j'ai essayé de modifier un peu l'exemple de la doc comme suit:
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2.1,2.1,300)
y = np.linspace(-2.1,2.1,300)
z = x*np.exp(-x**2-y**2)
# define grid.
xi = np.linspace(-2.1,2.1,100)
yi = np.linspace(-2.1,2.1,200)
# grid the data.
zi = griddata(x,y,z,xi,yi,interp='linear')
Et j'obtiens la même erreur. Je ne comprends pas ce qui ne va pas.
Merci pour votre aide.
OriginalL'auteur Napseis | 2012-12-08
Vous devez vous connecter pour publier un commentaire.
Considérer:
Cela signifie que nous savons de la z-valeurs en certains points le long de la ligne
x=y
.À partir de là,
demande
mlab.griddata
d'extrapoler les valeurs dez
pour tous les points dans une grille rectangulaire.Nous avons donné beaucoup d'informations sur la façon
z
varie le long de cette ligne, mais aucune information sur la façonz
varie dans la direction perpendiculaire (à l'écart de lax = y
ligne). Une erreur est levée parce quemlab.griddata
refuse à deviner.Vous obtiendrez de meilleurs résultats si votre première
x
,y
les données sont distribuées plus au hasard:Si vous voulez
mlab.griddata
pour extrapoler les données le long de la lignex=y
à l'ensemble de la grille de manière arbitraire, vous pouvez ajouter deux autres points de limite(xmin, ymax, z[0])
et(xmax,ymin,z[-1])
:Merci pour votre aide,votre méthode fonctionne très bien pour ce que je voudrais faire, et m'a permis de cerner le point de mon erreur avec mlab.griddata.
Cet exemple ne fonctionne pas pour moi, à l'aide de fond de carte. Il a besoin de la ligne suivante en outre:
xi, yi = np.meshgrid(xi, yi)
OriginalL'auteur unutbu
ok, j'ai enfin trouvé la solution de l'intrigue. Pour ceux que cela intéresse, voici l'astuce: utilisez le griddata de Scipy avec le "plus proche" de la méthode.
OriginalL'auteur Napseis