为什么 Z 必须是二维的才能在 matplotlib 中进行 3d 绘图

rns*_*nso 7 python 3d matplotlib

我正在尝试使用 matplotlibSurface plots使用此站点中的代码绘制 3d :

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
Run Code Online (Sandbox Code Playgroud)

并且使用以下代码完成 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)
Run Code Online (Sandbox Code Playgroud)

但是,如果我用我的 x、y、z 3d 数据(下面给出的示例)替换 X、Y 和 Z,则会出现一个错误,即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
Run Code Online (Sandbox Code Playgroud)

ano*_*one 6

这是因为,根据我的理解,要绘制曲面,您需要形成多边形网格。要绘制 3D 表面,您需要在 xy 平面上有小方块,然后为所有 xy 点提供 1 个相应的 z 值。正方形的面积越小意味着网格越细,分辨率越高(表面看起来光滑)。现在,如果您有任意一组 xyz 点,matplotlib 如何确定要绘制哪个表面。这就是为什么需要网格。当然,您可以使用数据 绘制 3d散点图线图。


b-f*_*-fg 2

文档中,您会发现x,y并且z需要一个二维数组。对于坐标xy您将需要使用numpy.meshgrid第一段代码中显示的坐标。这会为每个坐标创建一个二维数组,其中xy沿另一个方向恒定,并在其自身方向上变化。

对于z,这也需要是一个 2D 数组,因为将2D 数组的每个元素Axes3D.surface_plot 映射到和z定义的 2D 网格。xy

因此,当您使用自己的 时xyz确保使用numpy.meshgridforxy,然后定义 z = f(x,y) (例如您显示的函数flux_qubit_potential)。

编辑

在OP的评论之后,很明显,所需的输出是函数为g = f(x,y,z)的图g。这意味着g最终是一个 3D 数组。要根据等值面来做到这一点,请查看这些答案