python - 在 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()
希望现在问题更清楚了,并且您现在会很感激这个问题以支持投票
谢谢。
解决方案
您可以执行以下操作:
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)。
在这种情况下,您可以避免使用您的文字绘制大量“隐藏”您的模型的零。
希望这可以帮助
推荐阅读
- excel - 表格等行和列形式的数据,如何在每个单元格值后更改为带空格的文本?
- ios - 使用 loadview 方法时,swift 5 UIswitch 值更改不起作用
- c - 我正在尝试使用通过 Visual Studio 2019 安装的 mingw 在 VS Code 中编译 C/C++ 代码
- asp.net - 转移到服务器时,被混淆的代码不起作用
- python - matplotlib 访问 ax[i] 导致 TypeError: 'int' object is not subscriptable
- arrays - 帕斯卡记录没有价值
- flutter - 如何在颤动的列表中使用多个位置?
- c# - 如何使用 C# 获取详细办公室品牌/产品名称
- c++ - 多个生产者 - 消费者问题坚持最后一次消费
- jmeter - 如何在jmeter中由多个用户上传多个文件?