这是一个非常好的问题。我认为Matplotlib没有直接提供这样的功能,但我们可以通过模拟它的六个面来模拟一个立方体。获取这些表面,我们可以使用
这里提供的代码。
然后,我们需要在矩阵定义的位置绘制立方体。
为了使绘图看起来等轴测,我们使用一个变通方法,在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)):
o = [a - b / 2 for a, b in zip(center, size)]
l, w, h = size
x = [[o[0], o[0] + l, o[0] + l, o[0], o[0]],
[o[0], o[0] + l, o[0] + l, o[0], o[0]],
[o[0], o[0] + l, o[0] + l, o[0], o[0]],
[o[0], o[0] + l, o[0] + l, o[0], o[0]]]
y = [[o[1], o[1], o[1] + w, o[1] + w, o[1]],
[o[1], o[1], o[1] + w, o[1] + w, o[1]],
[o[1], o[1], o[1], o[1], o[1]],
[o[1] + w, o[1] + w, o[1] + w, o[1] + w, o[1] + w]]
z = [[o[2], o[2], o[2], o[2], o[2]],
[o[2] + h, o[2] + h, o[2] + h, o[2] + h, o[2] + h],
[o[2], o[2], o[2] + h, o[2] + h, o[2]],
[o[2], o[2], o[2] + h, o[2] + h, o[2]]]
return x, y, z
def plotCubeAt(pos=(0,0), N=0, ax=None):
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):
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](https://istack.dev59.com/iJ6Df.webp)