在python中绘制mXnXk矩阵作为三维模型

2024-05-23 16:38:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我要做的是在一个三维图中绘制它,第四维用颜色表示。这样我就能看到数据点的形状(代表分子轨道)并推断出它在那个点的大小。你知道吗

如果我绘制每个数据片段,我会得到想要的结果,但是在二维中,第三维是颜色。你知道吗

有没有一种方法可以使用Matplotlib或等效的库在python中绘制这个模型

谢谢

编辑:

我想弄清楚我想要什么。你知道吗

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

enter image description here

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

enter image description here

所以你可以看到,我有一个特定的结构,我想在情节中表现出来。你知道吗

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

我用来生成绘图的代码:

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()

希望现在的问题更清楚了,希望你现在对这个问题有足够的理解来投票

谢谢。你知道吗


Tags: 数据颜色npfig绘制pltax结构
2条回答

您可以为散布调整标记的颜色和大小。例如,您可以通过将标记的大小设置为0来过滤掉低于某个阈值的所有标记。也可以使标记的大小与场强度相适应。你知道吗

例如:

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

f = lambda x,y,z: np.exp(-(x-3)**2-(y-3)**2-(z-1)**2) - \
                  np.exp(-(x+3)**2-(y+3)**2-(z+1)**2)
t1 = np.linspace(-6,6,101)
t2 = np.linspace(-3,3,41)

# Data of shape 101,101,41
data = f(*np.meshgrid(t1,t1,t2))
print(data.shape)

# Coordinates
x = np.linspace(1,101,101)
y = np.linspace(1,101,101)
z = np.linspace(1,101,41)
xx,yy,zz = np.meshgrid(x,y,z)


fig=plt.figure()
ax = fig.add_subplot(111, projection='3d')

s = np.abs(data/data.max())**2*25
s[np.abs(data) < 0.05] = 0
ax.scatter(xx, yy, zz, s=s, c=data.flatten(), linewidth=0, cmap="jet", alpha=.5)
plt.show()

enter image description here

您可以执行以下操作:

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)。你知道吗

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

希望这有帮助

相关问题 更多 >