web-dev-qa-db-ja.com

matplotlibでの3DプロットのためにZが2次元でなければならない理由

このサイト からのコードを使用して3D Surface plotsをプロットしようとしています:matplotlibを使用して:

X、Y、Zは次のように取得されます。

from math import pi
from numpy import cos, meshgrid
alpha = 0.7
phi_ext = 2 * pi * 0.5

def flux_qubit_potential(phi_m, phi_p):
    return 2 + alpha - 2 * cos(phi_p)*cos(phi_m) - alpha * cos(phi_ext - 2*phi_p)

phi_m = linspace(0, 2*pi, 100)
phi_p = linspace(0, 2*pi, 100)
X,Y = meshgrid(phi_p, phi_m)
Z = flux_qubit_potential(X, Y).T

そして、3Dプロットは次のコードで実行されます。

from mpl_toolkits.mplot3d.axes3d import Axes3D

fig = plt.figure(figsize=(14,6))

# `ax` is a 3D-aware axis instance, because of the projection='3d' keyword argument to add_subplot
ax = fig.add_subplot(1, 2, 1, projection='3d')

p = ax.plot_surface(X, Y, Z, rstride=4, cstride=4, linewidth=0)

# surface_plot with color grading and color bar
ax = fig.add_subplot(1, 2, 2, projection='3d')
p = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
cb = fig.colorbar(p, shrink=0.5)

ただし、X、Y、Zをx、y、zの3dデータに置き換えると(以下のサンプルを参照)、Z has to be 2 dimensionalというエラーが発生します。次のように、通常のx、y、z値でプロットするにはどうすればよいですか。

   x   y   z
0  12  0  0.1
1  13  1  0.8
2  14  3  1.0
3  16  4  1.2
4  18  4  0.7
6
rnso

これは、私の理解では、サーフェスを描画するには、 ポリゴンメッシュ を形成する必要があるためです。 3Dサーフェスを描画するには、たとえばxy平面上に小さな正方形を配置し、すべてのx-yポイントに対応する1つのz値を設定する必要があります。正方形の領域が小さいほど、メッシュグリッドが細かくなり、解像度が向上します(滑らかに見えるサーフェス)。xyzポイントの任意のセットがある場合、matplotlibが描画するサーフェスを決定する方法。そのため、メッシュが必要です。もちろん、データを使用して3d 散布図 または 線図 をプロットできます。

2
anotherone

documentation には、xy、およびzが2D配列である必要があることがわかります。座標xおよびyについては、最初のコードで示すように_numpy.meshgrid_を使用する必要があります。これにより、座標ごとに2D配列が作成され、xyは他の方向に沿って一定であり、それ自体の方向で変化します。

zに関しては、2Dグリッドが定義された2D配列の各要素zが_Axes3D.surface_plot_mapsであるため、これも2D配列である必要があります。 xおよびyによる。

したがって、独自のxy、およびzを使用する場合は、必ずxおよびyに_numpy.meshgrid_を使用してから、z = f(x、y)を定義してください(例:関数_flux_qubit_potential_ )。

編集

OPのコメントの後、目的の出力が関数gがg = f(x、y、z)であるプロットであることは明らかです。これは、gが最終的に3D配列であることを意味します。等表面の観点からこれを行うには、 これらの回答 を見てください。

1
b-fg