[英]matplotlib plot_surface plot
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
变量创建一个二维网格,对应于参数u
和v
的乘积。 然后,计算出的x
, y
和z
变量是从u
和v
的球坐标创建的笛卡尔坐标。
我的问题如下: 为什么 plot_surface
的输入 必须是2D数组?
我怀疑这与计算每个曲面的法线有关,但是我似乎无法弄清楚。 是否有一些详细的文档对此进行了描述?
这个问题似乎提出了类似的问题,但是单个答案并不是特别有启发性。
表面的等式为:
f(x,y,z)=c
常数表征表面。 如果是圆形,则为:
(x^2 + y^2 + z^2)^(1/2) = c
其中c是半径。 的每个值给出一个表面。 换句话说,f(x,y,z)可以写成z = g(x,y)。 现在,如果您必须使用两个自变量x和y来跨越一个区域,则两个都必须是2D数组。 请注意,x和y均为二维数组,z也是如此。
不管看上去多么奇怪,二维参数网格
从球坐标空间描述表面[ R = const, u = < 0, 2pi >, v = < 0, pi > ]
通过映射将其转换为笛卡尔空间,
存储在一组[ MAT2Dx[,], MAT2Dy[,], MAT2Dz[,] ]
因为这是.plot_surface()
条件,所以.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]的解析描述容易在球体表面上,啮合是通过一对.linspace()
方法生成的[u,v]
-grid开始的,而保持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]
-2Dgrid的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.