2010-12-06 25 views
6

Pour la vie de moi, je n'arrive pas à comprendre comment obtenir les mêmes résultats que this.Couleur matplotlib en traceur 3D à partir d'un jeu de données x, y, z sans utiliser de contour

Le lien génère le tracé 3D coloré sans utiliser de contour. Si j'utilise la même technique mais avec mes propres ensembles de données x, y, z, je n'ai qu'une seule couleur.

La différence doit être dans la façon dont je génère les données z pour le tracé.

Quoi qu'il en soit, en utilisant ceci:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib.mlab import griddata 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 
import sys 

def xyz_ret(file): 
    f = open(file, 'r') 

    xyz = [] 
    for i in f: 
     ret = i.replace('\n','') 
     xyz.append(map(float,(ret.split('\t')))) 

    xyz = np.array(xyz) 
    return xyz[:,0],xyz[:,1],xyz[:,2]  


x,y,z = xyz_ret('300.txt') 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap=cm.jet, 
     linewidth=0) 

ax.set_zlim3d(min(z), max(z)) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf, shrink=0.5, aspect=5) 

plt.show() 

ensemble de données:

-2187.99902 9380.009151 0.0209 
-2187.00111 2474.994061 0.022 
-10755.98931 6119.598968 0.0296 
-5781.347693 609.427388 0.0301 
-8761.562524 1942.391853 0.0285 
-5695.576244 1894.624701 0.0251 
-3801.215106 1096.153308 0.0257 
-1616.821487 2452.940102 0.0182 
-5790.547537 2975.622971 0.022 
-8095.18467 4074.330871 0.0208 
-9997.367785 2771.330212 0.0264 
-10547.5635 4397.127096 0.0251 
-5781.706776 3984.545588 0.0191 
-3346.855289 4347.670408 0.0172 
-918.639762 4518.515925 0.0142 
-892.428381 5850.710005 0.0143 
-5844.499993 6516.904257 0.0204 
-10877.96951 6015.755723 0.0265 
-10813.37291 7704.306099 0.0302 
-7991.878303 7733.626264 0.0223 
-5861.073574 8725.943697 0.0217 
-3188.107715 6997.19893 0.0206 
-897.427629 7474.426336 0.0188 
-1388.841321 8786.642046 0.0194 
-3370.72325 8825.154803 0.0225 
-8561.226722 8851.111988 0.0285 
-10275.58972 8849.798032 0.0341 
-5853.645621 10113.77051 0.0255 
-8101.002878 10754.8429 0.0332 
-5765.080546 11378.95524 0.0299 
-3081.969839 10549.46676 0.0242 

Une seule couleur est affichée. Notez également que la barre de couleur n'a pas de ticks.

Pouvez-vous expliquer quel est mon problème?

+0

Je dirais que vous n'utilisez pas Axes3D.plot_surface. Vous importez Axes3D mais vous ne l'utilisez pas. – joaquin

+0

Son utilisé dans ax = fig.add_subplot (111, projection = '3d'), Si je supprime le Axes3d le script va erreur à cette ligne. – hl3fx

Répondre

2

La meilleure façon de lire les données de texte est par genfromtxt:

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

sys n'est pas nécessaire.

+0

hah, merci pour la friandise! :) – hl3fx

+0

J'utilise sys pour quitter le script de manière aléatoire tout en codant pour tester des choses. sys.exit() – hl3fx

16

Je pense qu'il y a un problème avec la surface "discontinue" de remplissage (griddata). alt text

code:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.mlab import griddata 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

data = np.genfromtxt('300.txt') 
x = data[:,0] 
y = data[:,1] 
z = data[:,2] 

xi = np.linspace(min(x), max(x)) 
yi = np.linspace(min(y), max(y)) 

X, Y = np.meshgrid(xi, yi) 
Z = griddata(x, y, z, xi, yi) 

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet, 
         linewidth=1, antialiased=True) 

ax.set_zlim3d(np.min(Z), np.max(Z)) 
fig.colorbar(surf) 

plt.show() 

S'il vous plaît noter que si l'on considère la surface au-dessus d'une zone rectangulaire (xi x yi), ce code fonctionne correctement. En d'autres termes, si vous "coupez" des bords irréguliers.

xi = np.linspace(-4000, -9000) 
yi = np.linspace(4000, 9000) 

alt text

+0

Merci pour les commentaires. J'essaie toujours de comprendre. Je me demande s'il existe un autre moyen d'obtenir les données z sans utiliser griddata? – hl3fx

+0

Un symptôme de ce qui précède serait également l'absence de marques de graduation dans la barre de couleur? Je pense que ces deux problèmes sont directement liés. Dans l'exemple de code, les graduations sont représentées représentant les différentes couleurs à la hauteur z. Si vous imprimez Z dans l'exemple de code, un tableau de listes est affiché rempli de chiffres, dans le code ci-dessus si vous imprimez Z une liste de --- est affichée. Des idées? – hl3fx

+0

hmm, merci d'avoir trouvé ça. Maintenant, comment réparer la surface cassée? J'ai trouvé quelqu'un d'autre avec le même problème ici: http://old.nabble.com/plot_surface-masked-array-tt27266471.html#a27266471. Malheureusement, il n'y a pas eu de réponse à sa question. – hl3fx

2

Je viens eu du mal avec le même problème.

Enfin, j'ai dû utiliser natgrid (qui est référencé here mais le lien ne fonctionne pas) au lieu de griddata. Pour moi, le truc avec la coupe de la région de l'intrigue n'a pas fonctionné, c'était toujours dans une couleur. Lors de l'installation de PyNGL, vérifiez que vous disposez de la dernière version de numpy.

Bonne chance