matplotlib 为什么Z必须是二维的3D绘图

ccgok5k5  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(187)

我正在尝试使用matplotlib中的this site代码绘制3d Surface plots
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
carvr3hs

carvr3hs1#

这是因为,在我的理解中,要绘制一个曲面,你需要形成一个polygon mesh。要绘制一个3d表面,你需要有小的正方形,例如,在xy平面上,然后为所有的x-y点有一个相应的z值。正方形的面积越小,意味着网格越细,分辨率越高(表面平滑)。)现在,如果你有任意一组xyz点,matplotlib如何确定要绘制哪个曲面。这就是为什么需要网格。当然,您可以使用数据绘制3d scatter或线图。

cqoc49vn

cqoc49vn2#

documentation中,你会发现xyz需要一个2D数组。对于坐标xy,您需要使用numpy.meshgrid,如第一段代码所示。这将为每个坐标创建一个2D阵列,其中xy沿着另一个方向恒定,并在其自身方向上变化。
对于z,这也需要是一个2D数组,因为Axes3D.surface_plot将2D数组z的每个元素Mapxy定义的2D网格。
因此,当您使用自己的xyz时,请确保将numpy.meshgrid用于xy,然后定义z = f(x,y)(e.例如,您显示的函数flux_qubit_potential)。

编辑

在OP的注解之后,很清楚所需的输出是函数g为g = f(x,y,z)的曲线图。这意味着g最终是一个3D数组。要在等值面方面做到这一点,请看these answers

相关问题