簡體   English   中英

matplotlib plot_surface圖

[英]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()

據我了解,這將為每個xyz變量創建一個二維網格,對應於參數uv的乘積。 然后,計算出的xyz變量是從uv的球坐標創建的笛卡爾坐標。

我的問題如下: 為什么 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]的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] -2Dgrid的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM