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

我正在尝试使用 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

并且使用以下代码完成 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 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


万千封印
浏览 887回答 2
2回答

largeQ

在文档中,您会发现x,y并且z需要一个二维数组。对于坐标x,y您将需要使用numpy.meshgrid第一段代码中显示的内容。这为每个坐标创建了一个二维数组,其中x和y沿另一个方向保持不变,并在其自身方向上变化。关于z,这也需要是一个二维数组,因为Axes3D.surface_plot 将二维数组的每个元素映射z到由x和定义的二维网格y。因此,当您使用自己的x,y并z确保使用numpy.meshgridfor xand 时y,然后定义 z = f(x,y) (例如flux_qubit_potential您显示的函数)。编辑:在 OP 的评论之后,很明显所需的输出是一个函数g为 g = f(x,y,z) 的图。这将意味着g最终是一个 3D 数组。要在等值面方面做到这一点,请查看这些答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python