首页 > 解决方案 > 在 python 中将 mXnXk 矩阵绘制为 3d 模型

问题描述

我有一个通过解析文件生成的矩阵,numpy 数组的大小为 101X101X41,每个条目都有一个值,表示每个点的大小。

现在我想做的是将它绘制在一个 3d 图中,其中第 4 维将由颜色表示。这样我就可以看到数据点的形状(代表分子轨道)并推断出它在那个点的大小。

如果我绘制每个数据切片,我会得到想要的结果,但是在 2d 中,以第 3 维作为颜色。

有没有办法使用 Matplotlib 或等效库在 python 中绘制这个模型

谢谢

编辑:

我试图让这个问题更清楚我想要什么。

我已经尝试了建议的解决方案,但我收到了以下情节:

在此处输入图像描述

可以看到,由于网格中有很多零,它“隐藏”了 3d 轨道。在下面的图中,可以看到一部分数据,我得到以下图:

在此处输入图像描述

所以你可以看到我有一个我想在情节中展示的结构。

我的问题是,有没有办法只绘制结构并忽略零,这样它们就不会“隐藏”结构。

我用来生成图的代码:

x = np.linspase(1,101,101)
y = np.linspase(1,101,101)
z = np.linspase(1,101,101)

xx,yy,zz = np.meshgrid(x,y,z)
fig=plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xx, yy, zz, c=cube.calc_data.flatten())
plt.show()

plt.imshow(cube.calc_data[:,:,11],cmap='jet')
plt.show()

希望现在问题更清楚了,并且您现在会很感激这个问题以支持投票

谢谢。

标签: pythonpython-3.xmatplotlibmultidimensional-array

解决方案


您可以执行以下操作:

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
epsilon = 2.5e-2 # threshold
height, width, depth = data.shape

global_min = np.inf
global_max = -np.inf

for d in range(depth):
    slice = data[:, :, d]
    minima = slice.min()
    if (minima < global_min): global_min = minima
    maxima = slice.max()
    if (maxima>global_max): global_max=maxima
    norm = colors.Normalize(vmin=minima, vmax=maxima, clip=True)
    mapper = cm.ScalarMappable(norm=norm, cmap=cm.jet)
    points_gt_epsilon = np.where(slice >= epsilon)
    ax.scatter(points_gt_epsilon[0], points_gt_epsilon[1], d,
                   c=mapper.to_rgba(data[points_gt_epsilon[0],points_gt_epsilon[1],d]), alpha=0.015, cmap=cm.jet)
    points_lt_epsilon = np.where(slice <= -epsilon)
    ax.scatter(points_lt_epsilon[0], points_lt_epsilon[1], d,
                   c=mapper.to_rgba(data[points_lt_epsilon[0], points_lt_epsilon[1], d]), alpha=0.015, cmap=cm.jet)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.title('Electron Density Prob.')
norm = colors.Normalize(vmin=global_min, vmax=global_max, clip=True)
cax, _ = colorbar.make_axes(ax)
colorbar.ColorbarBase(cax, cmap=cm.jet,norm=norm)
plt.savefig('test.png')
plt.clf()

这段代码所做的是从数据矩阵中逐个切片,并且对于每个散点图,只有所需的点(取决于 epsilon)。

在这种情况下,您可以避免使用您的文字绘制大量“隐藏”您的模型的零。

希望这可以帮助


推荐阅读