2016-11-03 38 views

回答

2

这是一个非常好的问题。 我认为matplotlib不直接提供任何这样的功能,但我们当然可以通过它的六个表面来模拟一个立方体。获得这些表面我们可以使用一块代码here。 然后,我们需要在由矩阵定义的位置绘制立方体。 为了使绘图看起来是等距的,我们使用一种解决方法,在mpl3d轴的立方体边界框的拐角处绘制不可见点。 最后,我们需要使轴不可见。

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

def cuboid_data(center, size=(1,1,1)): 
    # code taken from 
    # https://stackoverflow.com/questions/30715083/python-plotting-a-wireframe-3d-cuboid?noredirect=1&lq=1 
    # suppose axis direction: x: to left; y: to inside; z: to upper 
    # get the (left, outside, bottom) point 
    o = [a - b/2 for a, b in zip(center, size)] 
    # get the length, width, and height 
    l, w, h = size 
    x = [[o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in bottom surface 
     [o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in upper surface 
     [o[0], o[0] + l, o[0] + l, o[0], o[0]], # x coordinate of points in outside surface 
     [o[0], o[0] + l, o[0] + l, o[0], o[0]]] # x coordinate of points in inside surface 
    y = [[o[1], o[1], o[1] + w, o[1] + w, o[1]], # y coordinate of points in bottom surface 
     [o[1], o[1], o[1] + w, o[1] + w, o[1]], # y coordinate of points in upper surface 
     [o[1], o[1], o[1], o[1], o[1]],   # y coordinate of points in outside surface 
     [o[1] + w, o[1] + w, o[1] + w, o[1] + w, o[1] + w]] # y coordinate of points in inside surface 
    z = [[o[2], o[2], o[2], o[2], o[2]],      # z coordinate of points in bottom surface 
     [o[2] + h, o[2] + h, o[2] + h, o[2] + h, o[2] + h], # z coordinate of points in upper surface 
     [o[2], o[2], o[2] + h, o[2] + h, o[2]],    # z coordinate of points in outside surface 
     [o[2], o[2], o[2] + h, o[2] + h, o[2]]]    # z coordinate of points in inside surface 
    return x, y, z 

def plotCubeAt(pos=(0,0), N=0, ax=None): 
    # Plotting N cube elements at position pos 
    if ax !=None: 
     if N > 0: 
      for n in range(N): 
       X, Y, Z = cuboid_data((pos[0],pos[1],n)) 
       ax.plot_surface(X, Y, Z, color='b', rstride=1, cstride=1, alpha=1) 

def plotIsoMatrix(ax, matrix): 
    # plot a Matrix 
    # where matrix[i,j] cubes are added at position (i,j) 
    for i in range(matrix.shape[0]): 
      for j in range(matrix.shape[1]): 
       plotCubeAt(pos=(i,j), N=matrix[i,j], ax=ax) 

    l = max(matrix.shape[0], matrix.shape[1], matrix.max()) 
    bb = np.array([(0,0,0), (0,l,0), (l,0,0), (l,l,0),(0,0,l), (0,l,l), (l,0,l), (l,l,l)]) 
    ax.plot(bb[:,0], bb[:,1], bb[:,2], "w", alpha=0.0)    



if __name__ == '__main__': 
    fig = plt.figure() 
    ax = fig.gca(projection='3d') 
    ax.set_aspect('equal') 
    matrix = np.array([[3,2],[1,1]]) 
    plotIsoMatrix(ax, matrix) 
    ax.set_axis_off() 
    plt.show() 

enter image description here

+0

感谢哟非常 –