使用Python绘制具有颜色强度的立方体

使用Python绘制具有颜色强度的立方体,python,3d,cube,mayavi,pyopengl,Python,3d,Cube,Mayavi,Pyopengl,我想知道如何用Python绘制多个立方体。对于每个立方体,我有它的坐标(Xmin,Xmax,Ymin,Ymax,Zmin,Zmax)和它的值来根据这个值绘制立方体。实际上我真正想画的是体素 我见过一些库,如matplotlib、mayavi、OpenGL,但我不知道这些库中应该使用哪些以及如何使用。我认为这并不难,因为立方体是一个简单的规则图形,但我无法找到答案 由于我必须绘制许多立方体,最好设置范围,而不是表示所有立方体,我知道mayavi有此选项。在mayavi中,可以使用mlab.poin

我想知道如何用Python绘制多个立方体。对于每个立方体,我有它的坐标(Xmin,Xmax,Ymin,Ymax,Zmin,Zmax)和它的值来根据这个值绘制立方体。实际上我真正想画的是体素

我见过一些库,如matplotlib、mayavi、OpenGL,但我不知道这些库中应该使用哪些以及如何使用。我认为这并不难,因为立方体是一个简单的规则图形,但我无法找到答案


由于我必须绘制许多立方体,最好设置范围,而不是表示所有立方体,我知道mayavi有此选项。

在mayavi中,可以使用
mlab.points3d
从预定义形状列表中设置字形类型

points = mlab.points3d(px, py, pz, mode='cube')
这将在立方体中心的每个点绘制立方体

还可以打印图示符,然后稍后使用更改源类型

points.glyph.glyph_source.glyph_source = points.glyph.glyph_source.glyph_dict['cube_source']
(您也可以在管道菜单中执行此操作)

scale\u factor
参数将允许您更改多维数据集的大小


按体素数据绘制体素是一种不方便的方法,但它可以满足您的要求。

例如,在
mayavi
中,您可以使用
网格绘制立方体的面

from mayavi import mlab
import numpy as np

def cube_faces(xmin, xmax, ymin, ymax, zmin, zmax):
    faces = []

    x,y = np.mgrid[xmin:xmax:3j,ymin:ymax:3j]
    z = np.ones(y.shape)*zmin
    faces.append((x,y,z))

    x,y = np.mgrid[xmin:xmax:3j,ymin:ymax:3j]
    z = np.ones(y.shape)*zmax
    faces.append((x,y,z))

    x,z = np.mgrid[xmin:xmax:3j,zmin:zmax:3j]
    y = np.ones(z.shape)*ymin
    faces.append((x,y,z))

    x,z = np.mgrid[xmin:xmax:3j,zmin:zmax:3j]
    y = np.ones(z.shape)*ymax
    faces.append((x,y,z))

    y,z = np.mgrid[ymin:ymax:3j,zmin:zmax:3j]
    x = np.ones(z.shape)*xmin
    faces.append((x,y,z))

    y,z = np.mgrid[ymin:ymax:3j,zmin:zmax:3j]
    x = np.ones(z.shape)*xmax
    faces.append((x,y,z))

    return faces

def mlab_plt_cube(xmin,xmax,ymin,ymax,zmin,zmax):
    faces = cube_faces(xmin,xmax,ymin,ymax,zmin,zmax)
    for grid in faces:
        x,y,z = grid
        mlab.mesh(x,y,z,opacity=0.4)

mlab_plt_cube(0,1,0,1,0,1)
mlab.show()

我敢打赌,
cube\u faces
函数有一个单行程序。不过,我太累了,没法在这一秒好好考虑。

谢谢。我已经想到了这个解决方案,但我希望立方体的边是相邻的。如果我可以插入侧面尺寸,我就可以这样做,但我只能插入一个比例因子。我认为在mayavi中,这是一个“正确”的解决方案,对比例因子进行了一些实验,特别是如果比例永远不必改变的话。或者,也可以进行一些vtk编程,直接设置gylphs的大小。我能想到的mayavi中的任何其他解决方案(而不是直接使用vtk)都会涉及分配大量vtk对象,这些对象很快就会变得非常笨拙和缓慢。知道如何更改points3D图示符的方向吗?例如,在垂直于面的一组单位向量方面?