matplotlib plot_surface plot

时间:2014-10-27 12:23:18

标签: python matplotlib

matplotlib教程提供了一个如何绘制球形表面的好例子:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='b')

plt.show()

根据我的理解,这会为每个xyz变量创建一个2D网格,该变量与参数u和{{1的乘积相对应}}。然后,计算出的vxy变量是从zu中的球坐标创建的笛卡尔坐标。

我的问题如下:为什么<{1}} 的输入必须位于2D数组中?

我怀疑它与计算每个表面的法线有关,但我似乎无法弄明白。是否有一些详细的文档描述了这个?

This question似乎问了类似的问题,但单一的答案并不特别有启发性。

2 个答案:

答案 0 :(得分:0)

表面的方程是:

  f(x,y,z)=c

其中常量表征曲面。在圆圈的情况下,它是:

(x^2 + y^2 + z^2)^(1/2) = c

其中c是半径。给出一个表面的每个值。换句话说,f(x,y,z)可以写成 Z =克(X,Y)。现在,如果你必须跨越一个有两个独立变量的区域x&amp; y,两者都必须是2D数组。请注意,x和y都是2D数组,因此z。

答案 1 :(得分:0)

答:因为接口规范命令。

看起来很奇怪,2D参数网格,

描述表面 来自球面坐标空间的[ R = const, u = < 0, 2pi >, v = < 0, pi > ]通过映射

转换为笛卡尔空间

存储在一组[ MAT2Dx[,], MAT2Dy[,], MAT2Dz[,] ]

因为要求 .plot_surface() 方法需要接收表面数据。

>>> print ax.plot_surface.__doc__

        Create a surface plot.

        By default it will be colored in shades of a solid color,
        but it also supports color mapping by supplying the *cmap*
        argument.

        ============= ================================================
        Argument      Description
        ============= ================================================
        *X*, *Y*, *Z* Data values as 2D arrays
        *rstride*     Array row stride (step size)
        *cstride*     Array column stride (step size)
        *color*       Color of the surface patches
        *cmap*        A colormap for the surface patches.
        *facecolors*  Face colors for the individual patches
        *norm*        An instance of Normalize to map values to colors
        *vmin*        Minimum value to map
        *vmax*        Maximum value to map
        *shade*       Whether to shade the facecolors
        ============= ================================================

        Other arguments are passed on to
        :class:`~mpl_toolkits.mplot3d.art3d.Poly3DCollection`

根据设计,表面是2D实体,这里通过[R,u,v]或[X,Y,Z]坐标系进行参数化,并且由于[R,u,v]的简易性球体表面的分析描述,网格化开始于[u,v] - 由一对.linspace()方法生成的网格,而保持R=const=10

<强>此外:

>>> print np.outer.__doc__

    Compute the outer product of two vectors.

    Given two vectors, ``a = [a0, a1, ..., aM]`` and
    ``b = [b0, b1, ..., bN]``,
    the outer product [1]_ is::

      [[a0*b0  a0*b1 ... a0*bN ]
       [a1*b0    .
       [ ...          .
       [aM*b0            aM*bN ]]

创建了[100,100]形状的xyz矩阵, 作为[u,v] -> x(u,v), y(u,v), z(u,v)

的基于三角法则的映射

终于.plot_surface()方法在

中消耗了这些
 x,y,z = np.broadcast_matrices( x, y, z )

在开始生成2D表面对象列表(要绘图)之前,迭代原始[u,v] - 2D网格的范围。