【问题标题】:Why Z has to be 2-dimensional for 3d plotting in matplotlib为什么 Z 必须是二维的才能在 matplotlib 中进行 3d 绘图
【发布时间】:2019-04-14 06:31:05
【问题描述】:

我正在尝试使用 this site 中的代码使用 matplotlib 绘制 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 替换为我的 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

【问题讨论】:

标签: python matplotlib 3d


【解决方案1】:

documentation中你会发现xyz需要一个二维数组。对于坐标xy,您需要使用numpy.meshgrid,如第一段代码所示。这会为每个坐标创建一个二维数组,其中xy 在另一个方向上是恒定的,并且在自己的方向上会发生变化。

对于z,这也需要是一个二维数组,因为Axes3D.surface_plot 映射二维数组z 的每个元素与x 和@ 定义的二维网格987654335@.

因此,当您使用自己的 xyz 时,请确保将 numpy.meshgrid 用于 xy,然后定义 z = f(x,y) (例如你展示的函数flux_qubit_potential)。

编辑

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

【讨论】:

  • 通过这种方法,我不会使用我的 z 值。如何合并我的 z 值?
  • z 是坐标吗?您显示的代码是绘制 z = f(x,y)。不是一个函数,比如 g 是 g = f(x,y,z)。
  • 不,在我的数据中,z 是沿 z 轴的值(就像 x 和 y 是对应轴的值一样)。
  • 好的,那么你需要另一个函数,而不是Axes3D.surface_plot。给我一点时间,我会为你指明正确的方向。
【解决方案2】:

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

【讨论】:

  • 有什么方法可以将 x、y、z 值绘制为网格、线框或曲面?
  • 很难,因为理论上你可以有 2 个数据点,并且可以绘制一个曲面,当你尝试插值时会遇到同样的问题。这本质上是 3d 中的插值。所以你会有一个不光滑的表面,没有一个很好的三角剖分(或任何镶嵌)。无论如何你可以做到stackoverflow.com/questions/12423601/…(第二个答案)
猜你喜欢
  • 2016-01-08
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多