построение матрицы mXnXk как 3d-модели в python - PullRequest
0 голосов
/ 03 мая 2019

У меня есть матрица, сгенерированная путем синтаксического анализа файла, размер массива numpy равен 101X101X41, и у каждой записи есть значение, которое представляет величину в каждой точке.

Теперь я хочу построить его на трехмерном графике, где 4-е измерение будет представлено цветом. так что я смогу увидеть форму точек данных (представляющих молекулярные орбитали) и определить их величину в этой точке.

Если я строю каждый кусочек данных, я получаю желаемый результат, но в 2d с 3-м измерением в качестве цвета.

Есть ли способ построить эту модель в Python, используя Matplotlib или эквивалентную библиотеку

Спасибо

EDIT:

Я пытаюсь прояснить вопрос к тому, что я желаю.

Я попробовал предложенное решение, но получил следующий сюжет:

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 голосов
/ 08 мая 2019

Вы можете настроить цвет и размер маркеров для разброса. Так, например, вы можете отфильтровать все маркеры ниже определенного порога, установив их размер равным 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

0 голосов
/ 04 мая 2019

Вы можете выполнить следующее:

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

То, что делает этот фрагмент кода, собирается по частям из матрицы данных, и для каждого точечного графика только желаемые точки (зависят от эпсилона).

в этом случае вы избегаете построения множества нулей, которые «скрывают» вашу модель, используя ваши слова.

Надеюсь, это поможет

...