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()
根据我的理解,这会为每个x
,y
和z
变量创建一个2D网格,该变量与参数u
和{{1的乘积相对应}}。然后,计算出的v
,x
和y
变量是从z
和u
中的球坐标创建的笛卡尔坐标。
我的问题如下:为什么<{1}} 的输入必须位于2D数组中?
我怀疑它与计算每个表面的法线有关,但我似乎无法弄明白。是否有一些详细的文档描述了这个?
This question似乎问了类似的问题,但单一的答案并不特别有启发性。
答案 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]形状的x
,y
,z
矩阵,
作为[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网格的范围。