我正在尝试使用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).T3d打印是用以下代码完成的:
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发布于 2018-11-11 19:12:05
这是因为,在我的理解中,要绘制一个表面,你需要形成一个polygon mesh。要绘制3d曲面,您需要有小正方形,例如,在xy平面上,然后为所有x-y点设置1个相应的z值。正方形的面积越小,意味着网格越细,分辨率越高(表面看起来很平滑)。现在,如果您有一组任意的xyz点,matplotlib如何确定要绘制的曲面。这就是为什么需要网格的原因。当然,您可以使用您的数据绘制3d scatter或line plots。
发布于 2018-11-11 19:11:03
在documentation中,你会发现x,y和z需要一个二维数组。对于坐标x和y,您需要使用numpy.meshgrid,如第一段代码中所示。这将为每个坐标创建一个二维数组,其中x和y在另一个方向上是恒定的,并且在其自己的方向上是可变的。
关于z,这也需要是一个2D数组,因为Axes3D.surface_plot 将2D数组z的每个元素映射到由x和y定义的2D网格。
因此,当您使用自己的x、y和z时,请确保将numpy.meshgrid用于x和y,然后定义z= f(x,y) (例如,您显示的函数flux_qubit_potential )。
编辑
在OP的注释之后,很明显,期望的输出是一个图,其中函数g是g= f(x,y,z)。这意味着g最终是一个3D数组。要在等参曲面方面做到这一点,请看一下these answers。
https://stackoverflow.com/questions/53246874
复制相似问题