このサイト からのコードを使用して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
documentation には、x
、y
、およびz
が2D配列である必要があることがわかります。座標x
およびy
については、最初のコードで示すように_numpy.meshgrid
_を使用する必要があります。これにより、座標ごとに2D配列が作成され、x
とy
は他の方向に沿って一定であり、それ自体の方向で変化します。
z
に関しては、2Dグリッドが定義された2D配列の各要素z
が_Axes3D.surface_plot
_mapsであるため、これも2D配列である必要があります。 x
およびy
による。
したがって、独自のx
、y
、およびz
を使用する場合は、必ずx
およびy
に_numpy.meshgrid
_を使用してから、z = f(x、y)を定義してください(例:関数_flux_qubit_potential
_ )。
編集:
OPのコメントの後、目的の出力が関数g
がg = f(x、y、z)であるプロットであることは明らかです。これは、g
が最終的に3D配列であることを意味します。等表面の観点からこれを行うには、 これらの回答 を見てください。