【问题标题】:Draw Isometric figure based on matrix基于矩阵绘制等轴测图
【发布时间】:2016-11-03 14:22:01
【问题描述】:

如何从带有数字的矩阵生成等距??

我需要想法

例子:

矩阵:

[[3,2],

[1,1]]

这个

每个数字是高度,3代表3立方高第一个文件,2代表2立方高第一个文件第二个元素

谢谢

【问题讨论】:

    标签: python-2.7 python-3.x matplotlib


    【解决方案1】:

    这是一个非常好的问题。 我认为 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()
    

    【讨论】:

    • 非常感谢您
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多