[英]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.