Python:如何绘制类似于Matlab的`pcshow`的3D网格?

时间:2018-01-03 19:45:59

标签: python matplotlib

我正在尝试绘制存储在3D矩阵data中的立方3D场景网格,其包含索引(例如[0..10]),其指示在哪个颜色上绘制体素,其中0是“空”标签。在Matlab中我使用以下代码:

[X,Y,Z] = meshgrid(1:size(data,1),1:size(data,2),1:size(data,3));
xyz=[X(:) Y(:) Z(:)];
idx = data~=0;   % Ignore labels 0 -> they specify empty voxels
pcshow(xyz(idx,:),data(idx),'MarkerSize',1000)

python中是否有类似的功能?

stackoverflow-answer已接近,但缺少传递data矩阵的可能性。黑客将遍布所有标签,但我正在寻找更优雅的解决方案。

1 个答案:

答案 0 :(得分:0)

这是一些python解决方案:

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

X, Y, Z = np.meshgrid(np.arange(data.shape[0]), np.arange(data.shape[1]), np.arange(data.shape[2]))
[x, y, z] = (np.reshape(X, (-1)), np.reshape(Y, (-1)), np.reshape(Z, (-1)))
idx = (data != 0) 
idx = np.reshape(idx, (-1))
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
scat = ax.scatter(x[idx], y[idx], z[idx], c=np.reshape(data,(-1))[idx], cmap='jet', marker="s")

# Some additional formatting
ax.set_xlabel('X', fontsize=9)
ax.set_ylabel('Y', fontsize=9)
ax.set_zlabel('Z', fontsize=9)

# Setting camera angle
az = 150
el = 30
ax.view_init(elev=el, azim=az)
fig.colorbar(scat, shrink=0.5, aspect=5)