在python

时间:2019-05-03 08:58:55

标签: python python-3.x matplotlib multidimensional-array

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

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

如果我绘制每个数据切片,我将获得期望的结果,但是在二维中以3维为颜色。

是否有一种方法可以使用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()

希望现在的问题更加清楚了,希望您对此问题已经足够赞赏,可以投票支持

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

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

在这种情况下,您避免使用单词来绘制很多“隐藏”模型的零。

希望这会有所帮助

答案 1 :(得分:0)

您可以调整散点图标记的颜色和大小。因此,例如,您可以通过将所有标记的大小设置为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