20

2D numpy 配列があり、それを 3D でプロットしたいと考えています。mplot3d について聞いたことがありますが、正しく動作しません

これが私がやりたいことの例です。次元 (256,1024) の配列があります。x 軸が 0 から 256、y 軸が 0 から 1024 で、グラフの z 軸が各エントリの配列の値を表示する 3D グラフをプロットする必要があります。

どうすればいいですか?

4

4 に答える 4

23

サーフェスプロットを作成しようとしているようです(または、ワイヤーフレームプロットまたは塗りつぶされたカウントプロットを描画することもできます) 。

質問の情報から、次のようなことを試すことができます。

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Set up grid and test data
nx, ny = 256, 1024
x = range(nx)
y = range(ny)

data = numpy.random.random((nx, ny))

hf = plt.figure()
ha = hf.add_subplot(111, projection='3d')

X, Y = numpy.meshgrid(x, y)  # `plot_surface` expects `x` and `y` data to be 2D
ha.plot_surface(X, Y, data)

plt.show()

numpy.random明らかに、合理的な表面を得るためには、使用するよりも賢明なデータを選択する必要があります。

于 2012-07-10T08:58:11.660 に答える
2

関数bar3dを使用して 3D 棒グラフを試すことができます。

次元 (25, 10) の配列 A があるとします。インデックス (i, j) の値は A[i][j] です。次のコード サンプルは、各棒の高さが A[i][j] である 3D 棒グラフを提供します。

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

np.random.seed(1234)
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
A = np.random.randint(5, size=(25, 10))

x = np.array([[i] * 10 for i in range(25)]).ravel() # x coordinates of each bar
y = np.array([i for i in range(10)] * 25) # y coordinates of each bar
z = np.zeros(25*10) # z coordinates of each bar
dx = np.ones(25*10) # length along x-axis of each bar
dy = np.ones(25*10) # length along y-axis of each bar
dz = A.ravel() # length along z-axis of each bar (height)

ax1.bar3d(x, y, z, dx, dy, dz)

ランダム シード 1234 を使用する PC では、次のプロットが得られます。 ここに画像の説明を入力

ただし、次元 (256, 1024) に関する問題のプロットを作成するには時間がかかる場合があります。

于 2018-12-03T10:11:22.220 に答える
1

Matplotlib ギャラリーの例の 1 つで答えを見つけることができます。3D の例は終わりに近づいています。

より一般的には、Matplotlib ギャラリーは、いくつかのプロットを実行する方法を見つけるための優れた最初のリソースです。

私が見た例は基本的に3 つの2D 配列で動作します。1 つはすべての x 値、もう 1 つはすべての y 値、最後の 1 つはすべての z 値です。したがって、1 つの解決策は、x 値と y 値の配列を作成することです (meshgrid()たとえば、 を使用)。

于 2012-07-10T08:55:02.223 に答える
0

実際には python-octave ブリッジであるoct2pyモジュールを使用することもできます。それを使用すると、オクターブの機能を活用でき、必要なものを取得できます。これも非常に簡単です。

このドキュメントをチェックしてください: https://www.gnu.org/software/octave/doc/v4.0.1/Three_002dDimensional-Plots.html

サンプルの例:

from oct2py import octave as oc

tx = ty = oc.linspace (-8, 8, 41)
[xx, yy] = oc.meshgrid (tx, ty)
r = oc.sqrt (xx * xx + yy * yy) + oc.eps()
tz = oc.sin (r) / r
oc.mesh (tx, ty, tz)

上記はpythonコードで、上記のドキュメントのオクターブで実装された最初の例と同じです。

于 2016-07-05T13:02:34.870 に答える