在3D-mplot3d中绘制随机堆叠的立方体?

时间:2017-04-18 21:34:22

标签: python matplotlib 3d mplot3d

我正在探索随机堆叠的多维数据集。

我从2D开始,可以在矩形内生成随机打包,如下所示: 2D random cube packing 现在我有了将堆叠推广到3D的代码,但我正在努力推广可视化。示例数据集是使用1x1x1和2x2x2多维数据集填充3x3x3多维数据集,

#the coordinates of a corner vertex of the 19 1x1x1 cubes
x1 = [1, 0, 2, 0, 0, 0, 2, 1, 0, 1, 2, 2, 0, 0, 0, 2, 0, 1, 1]
y1 = [1, 1, 0, 2, 0, 0, 2, 2, 2, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0]
z1 = [2, 1, 1, 0, 1, 2, 2, 2, 2, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2]
#the coordinates of a corner vertex of the 1 2x2x2 cube 
x2 = [1]
y2 = [1]
z2 = [0]
# I believe the random filling is working because
# the total volumes equal:  19 + 2**3 = 3**3

#I would like to start with the lists  
X = [x1,x2]
Y = [y1,y2]
Z = [z1,z2]
sizes = [1,2]
#because I want to generalize the visualization to n sizes

到目前为止,我所有的知识都是绘制数据的3D分散

from matplotlib import pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for ii in range(len(sizes)): 
    ax.scatter(X[ii],Y[ii],Z[ii])
plt.show()

我想制作一个更像这样的情节,除了可变尺寸。 stacked cubes

任何帮助将不胜感激!我有很多关于matplotlib / pyplot等的知识。

我取得了一些进展:

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, PathPatch
from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.art3d as art3d

def cube(a,b,c,l): 
for zz in [c,c+l]: 
    for i in ["x","y","z"]:
        side = Rectangle((a, b), l,l)
        ax.add_patch(side)
        art3d.pathpatch_2d_to_3d(side, z=zz, zdir=i)


fig = plt.figure()
ax=fig.gca(projection='3d')

cube(0,0,0,1)



ax.set_xlim3d(-2, 2)
ax.set_ylim3d(-2, 2)
ax.set_zlim3d(-2, 2)

plt.show()

这绘制了一个立方体。

编辑:

更多进展,我现在非常接近

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle, PathPatch
from mpl_toolkits.mplot3d import Axes3D 
import mpl_toolkits.mplot3d.art3d as art3d

cmap = plt.get_cmap('spring') #define the colors of the plot 
colors = [cmap(i) for i in np.linspace(0.1, 0.9, n+1)]  

def cube(a,b,c,l): #plots a cube of side l at (a,b,c)  
        for ll in [0,l]:
            for i in range(3):
                dire= ["x","y","z"]
                xdire = [b,a,a] 
                ydire = [c,c,b]
                zdire = [a,b,c]
                side = Rectangle((xdire[i],                                                         ydire[i]),facecolors[np.where(sizes == l)[0]],edgecolor='black')
                ax.add_patch(side)
                art3d.pathpatch_2d_to_3d(side, z=zdire[i]+ll, zdir=dire[i])

def plotter3D(X,Y,Z,sizes): #run cube(a,b,c,l) over the whole data set 
    for iX in range(len(X)):
        x = X[iX]
        y = Y[iX]
        z = Z[iX]
        for ix in range(len(x)): 
            cube(x[ix],y[ix],z[ix],sizes[iX])


fig = plt.figure() #open a figure 
ax=fig.gca(projection='3d') #make it 3d
plotter3D(X,Y,Z,sizes) #generate the cubes from the data set 
ax.set_xlim3d(0, length) #set the plot ranges 
ax.set_ylim3d(0, width)
ax.set_zlim3d(0, height)
plt.show()

这会生成所需的输出,但从某些角度看,它在某些地方似乎是透明的。你可以在小立方体中看到这个 - 坐标处的死点(1.5,2,3)任何想法如何解决这个问题? output

另一个编辑: 上面解决的解决方案有两个问题:(1)我不能获得三个轴的相等纵横比,(2)立方体从某些角度透视。这是大型系统的输出结果 seethru boxes

0 个答案:

没有答案