4

これは 3D プロット コードの MATLAB バージョンです: 編集: これは現在のコードです:

        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
4

2 に答える 2

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)

またはそのようなもの(変数が実際に何であるかはわかりませんこれは単なる例です)。

于 2011-01-26T07:20:36.677 に答える
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()

これにより、次のようなプロットが得られます。

サーフィン

ファイルとして保存しましたが、 を呼び出すとplt.show()、視点を好きなように変更できるインタラクティブなウィンドウが表示されます。

于 2011-01-26T09:49:04.977 に答える