2011-01-26 95 views
4

這是MATLAB版本的3D繪圖代碼: 編輯: 這是當前的代碼:如何在Python中製作3D圖?

 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') 

這是錯誤消息我得到:

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

如果您要顯示所有代碼,包括`matplotlib`和`numpy`的導入,它將會有所幫助。 – 2011-01-26 10:02:59

+0

我已根據您展示的pastebin代碼更新了我的答案。 – 2011-01-26 11:09:19

回答

4

爲X和Y設置網格網格後,您需要爲Z值創建一個網格。

我目前做這在我的代碼的方式是:

# [ (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() 

這給了我一個情節,看起來像這樣:

surf

我已經保存爲一個文件,但是當您撥打plt.show()時,您會看到一個交互式窗口,您可以將視角更改爲任何您想要的內容。

4

有什麼不對?你正在試圖使一個非數字否定。換言之:AxesSubplot(不管那是什麼)不實現一元運算符。

因此,該代碼不能合理地「你做了什麼」,因爲你甚至沒有在該代碼中定義b,但它存在並且是一種名爲AxesSubplot的自定義類型。如果你解釋AxesSubplot是什麼,那麼這將有所幫助。如果可能的話,嘗試使用包含實際演示問題的代碼。

編輯: 正如DSM指出的那樣,您會覆蓋您的b變量。 問題是,你被卡在「數學模式」,並使用非描述性的變量名稱,如「a」,「b」和「M」。改用更長的描述性名稱。

相反的:

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

做:

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

或者類似的東西(我不知道什麼是變量實際上,所以這只是一個例子)。

+0

對不起。 b是一個浮動。 http://pastebin.com/9TB02WQz – user569474 2011-01-26 08:05:42