使用python绘制三维圆柱网格模型图——voxels函数的使用

最近接到老师的新任务——画一个XXX的三维模型图,和师兄交流后大概知道了要做什么,在师兄的建议下成功入了python的坑。

然而网上查了很长时间才在matplotlib的example中找到了这种画圆柱网格的模型图的实例。

实例

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


def midpoints(x):
   sl = ()
   for i in range(x.ndim):
       x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]]) / 2.0
       sl += np.index_exp[:]
   return x

# prepare some coordinates, and attach rgb values to each
r, theta, z = np.mgrid[0:1:11j, 0:np.pi*2:25j, -0.5:0.5:11j]
x = r*np.cos(theta)
y = r*np.sin(theta)

rc, thetac, zc = midpoints(r), midpoints(theta), midpoints(z)

# define a wobbly torus about [0.7, *, 0]
sphere = (rc - 0.7)**2 + (zc + 0.2*np.cos(thetac*2))**2 < 0.2**2

# combine the color components
hsv = np.zeros(sphere.shape + (3,))
hsv[..., 0] = thetac / (np.pi*2)
hsv[..., 1] = rc
hsv[..., 2] = zc + 0.5
colors = matplotlib.colors.hsv_to_rgb(hsv)

# and plot everything
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.voxels(x, y, z, sphere,
         facecolors=colors,
         edgecolors=np.clip(2*colors - 0.5, 0, 1),  # brighter
         linewidth=0.5)

plt.show()

对于我这种python小白来说(黑人问号???)
但一看这效果图,嗯嗯就是它!!!


效果图.png

通过百度看了半天终于懂了这段代码是什么意思了。嗯,没错,除了voxels函数其他都没用。。。。更蛋疼的是竟然百度不到voxels的用法,这个时候help()命令可帮了大忙。

voxels原版说明

    voxels(*args, **kwargs) method of matplotlib.axes._subplots.Axes3DSubplot instance
    ax.voxels([x, y, z,] /, filled, **kwargs)

    Plot a set of filled voxels

    All voxels are plotted as 1x1x1 cubes on the axis, with filled[0,0,0]
    placed with its lower corner at the origin. Occluded faces are not
    plotted.

    Call signatures::

        voxels(filled, facecolors=fc, edgecolors=ec, **kwargs)
        voxels(x, y, z, filled, facecolors=fc, edgecolors=ec, **kwargs)

    .. versionadded:: 2.1

    Parameters
    ----------
    filled : 3D np.array of bool
        A 3d array of values, with truthy values indicating which voxels
        to fill

    x, y, z : 3D np.array, optional
        The coordinates of the corners of the voxels. This should broadcast
        to a shape one larger in every dimension than the shape of `filled`.
        These can be used to plot non-cubic voxels.

        If not specified, defaults to increasing integers along each axis,
        like those returned by :func:`~numpy.indices`.
        As indicated by the ``/`` in the function signature, these arguments
        can only be passed positionally.

    facecolors, edgecolors : array_like, optional
        The color to draw the faces and edges of the voxels. Can only be
        passed as keyword arguments.
        This parameter can be:

          - A single color value, to color all voxels the same color. This
            can be either a string, or a 1D rgb/rgba array
          - ``None``, the default, to use a single color for the faces, and
            the style default for the edges.
          - A 3D ndarray of color names, with each item the color for the
            corresponding voxel. The size must match the voxels.
          - A 4D ndarray of rgb/rgba data, with the components along the
            last axis.

    **kwargs
        Additional keyword arguments to pass onto
        :func:`~mpl_toolkits.mplot3d.art3d.Poly3DCollection`

    Returns
    -------
    faces : dict
        A dictionary indexed by coordinate, where ``faces[i,j,k]`` is a
        `Poly3DCollection` of the faces drawn for the voxel
        ``filled[i,j,k]``. If no faces were drawn for a given voxel, either
        because it was not asked to be drawn, or it is fully occluded, then
        ``(i,j,k) not in faces``.

大概看了下,发现比较重要的参数就是x,y,z和filled。

  • filled参数
 filled : 3D np.array of bool
        A 3d array of values, with truthy values indicating which voxels
        to fill

它是一个三维的布尔数组。
注意:一定要是三维的!!!
三个维度的长度分别是你的圆柱形网格在r,θ,z方向上的网格数。以上面的实例为例,实例里r方向有10个网格,θ方向有24个网格,z方向有10个网格,所以sphere是一个(10,24,10)的三维数组。

z方向10个网格.png

最后说一下filled数组的取值影响,filled取True,则表示该网格填充,取Flase则表示不填充。若将实例中的sphere改为全是True的数组,则结果如下图所示。
sphere全是True.png

  • x,y,z参数
    每个参数也都是三维数组,这三个参数的定义可以保证你的网格不是正方体,将实例中的三个参数删除后结果如下。


    无xyz参数.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容