2011-01-26 4 views
4

Ceci est la version Matlab du code de traçage 3D: EDIT: Voici le code actuel:Comment faire des tracés 3D en Python?

 plt.figure(2) 
     fig_b = Axes3D(fig2) 
     xx2 = np.arange(0, L+h_grid*L, h_grid*L) 
     yy2 = np.arange(-b, b+h_grid*b, h_grid*b) 
     X, Y = np.meshgrid(xx2, yy2) 
     W = np.zeros((41,21), float) 
     mx = len(xx2)*len(yy2) 
     X = np.reshape(X, (1, mx)) 
     Y = np.reshape(Y, (1, mx)) 
     W = np.reshape(W, (1, mx)) 
     for j in range(0, mx): 
      W[0][j] = np.sin(np.pi*X[0][j]/L) 
     surf = fig_b.plot_surface(X, Y, W, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False) # This is the line number 168 
     plt.xlabel('x') 
     plt.ylabel('y') 

Ceci est le message d'erreur que je reçois:

Traceback (most recent call last): 
    File "nonhomog.py", line 247, in <module> 
    main() 
    File "nonhomog.py", line 245, in main 
    nonhomog(nu) 
    File "nonhomog.py", line 168, in nonhomog 
    surf = fig_b.plot_surface(X, Y, W, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False) 
    File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/axes3d.py", line 618, in plot_surface 
    polyc = art3d.Poly3DCollection(polys, *args, **kwargs) 
    File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 290, in __init__ 
    PolyCollection.__init__(self, verts, *args, **kwargs) 
    File "/usr/lib/pymodules/python2.6/matplotlib/collections.py", line 668, in __init__ 
    self.set_verts(verts, closed) 
    File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 312, in set_verts 
    self.get_vector(verts) 
    File "/usr/lib/pymodules/python2.6/mpl_toolkits/mplot3d/art3d.py", line 305, in get_vector 
    xs, ys, zs = zip(*points) 
ValueError: need more than 0 values to unpack 
+0

Il serait utile que vous montriez tout votre code, y compris les importations 'matplotlib' et' numpy'. –

+0

J'ai mis à jour ma réponse en fonction du code pastebin que vous avez montré. –

Répondre

4

La façon dont je fais actuellement dans mon code est:

# [ (x1, y1, z1), (x2, y2, z2), ... (xN, yN, zN) ] 
all_vals = ... 
# (x1, x2, ... xN) , (y1, y2, ... yN) , (z1, z2, ... zN) 
all_xvals, all_yvals, all_zvals = zip(*all_vals) 
fig = plt.figure() 
ax = Axes3D(fig) 
X, Y = np.meshgrid(xvals, yvals) 
# This is the part you want: 
Z1 = np.zeros(X.shape, float) 
for (x, y, z) in all_vals: 
    x = find_in_sorted_list(x, xvals) 
    y = find_in_sorted_list(y, yvals) 
    Z1[y,x] = z  
surf = ax.plot_surface(X, Y, Z1, rstride=1, cstride=1, cmap=cm.jet, 
     linewidth=0, antialiased=False) 
plt.xlabel('Blur standard deviation') 
plt.ylabel('JPEG quality') 
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() 

Cela me donne une intrigue qui ressemble à ceci:

surf

Je l'ai sauvé dans un fichier, mais quand vous appelez plt.show(), vous obtenez une fenêtre interactive où vous pouvez changer le point de vue à tout ce que vous voulez.

+0

Merci! Ça a l'air très prometteur. Pouvez-vous voir mes modifications à ma question initiale, s'il vous plaît? J'ai ajouté quelque chose. Je reçois ce message d'erreur: "ValueError: besoin de plus de 0 valeurs pour décompresser" Quel est le problème avec mon nouveau code? – user569474

+0

Le problème peut être lié au fait que vous remodelez vos grilles en tant que tableaux 1D (1 ligne, N colonnes). Ils devraient être des tableaux 2D.Regardez de plus près mon code - regardez comment Z1 est initialisé et comment il est peuplé de valeurs. – misha

+0

Merci! J'ai ajouté ces lignes: X = np.reshape (X, (41, 21)) Y = np.reshape (Y, (41, 21)) W = np.reshape (W, (41, 21)) après la boucle for de mon code actuel et maintenant cela fonctionne comme un rêve. – user569474

4

Qu'est-ce qui ne va pas? Vous essayez de faire un non-nombre négatif. En d'autres termes: AxesSubplot (quel qu'il soit) n'implémente pas l'opérateur unaire. Donc, ce code ne peut pas raisonnablement être "ce que vous avez fait", car vous ne définissez même pas b dans ce code, mais il existe et est de type personnalisé appelé AxesSubplot. Si vous expliquez ce qu'est AxesSubplot, cela vous aidera. Essayez d'inclure du code qui démontre le problème, si possible. Comme l'indique DSM, vous remplacez votre variable b. Le problème est que vous êtes coincé en "mode maths" et utilisez des noms de variables non descriptives comme "a", "b" et "M". Utilisez plutôt des noms descriptifs plus longs.

Au lieu de:

a = fig.add_subplot(2,2,i) 
b = fig2.add_subplot(2,2,i) 

faire:

x_subplot = fig.add_subplot(2,2,i) 
y_subplot = fig2.add_subplot(2,2,i) 

Ou quelque chose comme ça (je ne suis pas sûr de ce que la variable effectivement est, de sorte que est juste un exemple). Après avoir configuré la grille de maillage pour X et Y, vous devez créer une grille pour les valeurs de Z.

+0

Désolé. b est un flotteur. http://pastebin.com/9TB02WQz – user569474

+0

@ user569474: Non ce n'est pas le cas. C'est un AxesSubplot. L'erreur indique clairement ceci. Ce n'est * pas * un flotteur. –

+0

@ user569474: voyez la ligne 107 de votre code pastebin, b = fig2.add_subplot (2,2, i), qui écrase votre affectation b = 0.5. Comme indiqué ci-dessus, les messages d'erreur n'ont pas toujours raison, mais ils sont généralement le meilleur endroit pour commencer. – DSM