Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将mXnXk矩阵绘制为三维模型_Python_Python 3.x_Matplotlib_Multidimensional Array - Fatal编程技术网

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

在python中将mXnXk矩阵绘制为三维模型,python,python-3.x,matplotlib,multidimensional-array,Python,Python 3.x,Matplotlib,Multidimensional Array,我有一个通过解析文件生成的矩阵,numpy数组的大小为101X101X41,每个条目都有一个值,表示每个点的大小 现在我要做的是在3d图中绘制它,其中第四维将用颜色表示。这样我就能看到数据点的形状(代表分子轨道)并推断出它在那个点的大小 如果我绘制每个数据片段,我会得到想要的结果,但是是以三维为颜色的2d 有没有办法使用Matplotlib或等效库在python中绘制此模型 谢谢 编辑: 我试图让这个问题更清楚地表达我的愿望 我尝试了建议的解决方案,但我收到了以下图: 正如我们所看到的,由于网

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

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

如果我绘制每个数据片段,我会得到想要的结果,但是是以三维为颜色的2d

有没有办法使用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()
fig=plt.figure()
ax=图添加_子图(111,投影='3d')
ε=2.5e-2#阈值
高度、宽度、深度=data.shape
全局_min=np.inf
全局_max=-np.inf
对于范围内的d(深度):
切片=数据[:,:,d]
最小值=slice.min()
if(最小值<全局最小值):全局最小值=最小值
最大值=slice.max()
如果(最大值>全局最大值):全局最大值=最大值
norm=颜色。规格化(vmin=最小值,vmax=最大值,clip=真)
映射器=cm.ScalarMappable(norm=norm,cmap=cm.jet)
点\u gt\u epsilon=np.其中(切片>=epsilon)
最大散射(点ε[0],点ε[1],d,
c=映射器到rgba(数据[点ε[0],点ε[1],d]),α=0.015,cmap=cm.jet)

点\u lt_epsilon=np。其中(切片可以调整散射标记的颜色和大小。因此,例如,可以通过将标记的大小设置为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()
将numpy导入为np
将matplotlib.pyplot作为plt导入
从mpl_toolkits.mplot3d导入Axes3D
f=λ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,6101)
t2=np.linspace(-3,3,41)
#形状101101,41的数据
数据=f(*np.meshgrid(t1、t1、t2))
打印(data.shape)
#坐标
x=np.linspace(1101)
y=np.linspace(1101)
z=np.linspace(1101,41)
xx,yy,zz=np.meshgrid(x,y,z)
图=plt.图()
ax=图添加_子图(111,投影='3d')
s=np.abs(data/data.max())**2*25
s[np.abs(数据)<0.05]=0
最大散射(xx,yy,zz,s=s,c=data.flatte(),线宽=0,cmap=“jet”,α=0.5)
plt.show()

您可能忘记了解决方案的
meshgrid
部分。@ImportanceOfBeingErnest我添加了网格,得到了x,y,z,每个都是101X101X41大小,但是当我将数据矩阵分散时,我得到了以下错误-ValueError:“c”参数有101个元素,这对于大小为41的“x”是不可接受的8241,“y”,尺寸418241。大家别忘了这是一个旨在帮助他人的平台,如果有更多经验的人投票反对他,那么应该如何在这个平台上提高自己的技能,而不是指导他,想想看。这个问题表明他试图并遵循这个平台的规则来提问和改进自己的问题您没有在代码中显示
数据
,但我怀疑它需要是
c=data.flatte()
。谢谢,这正是我所需要的!很抱歉没有对这个问题投赞成票。原因是它没有一个可运行的示例,迫使我自己创建这样的数据。我通常不会对这样的问题投反对票。