用Python绘制第四维

时间:2015-08-04 11:59:23

标签: python numpy matplotlib plot

我想知道是否有可能使用python进行四维绘图。特别是我会有一个三维网格X,Y,Z和 f(X,Y,Z)= 1 f(X,Y,Z)= 0 。 因此,对于某些特定点(X,Y,Z),我需要一个符号(例如" o"或" x")。 我不需要色标。

请注意,我有100个矩阵(512 * 512)由1或0组成:所以我的网格应该是512 * 512 * 100.

我希望我已经清楚了!感谢。

编辑: 这是我的代码:

X = np.arange(W.shape[2])
Y = np.arange(W.shape[1])
Z = np.arange(W.shape[0])
X, Y, Z = np.meshgrid(X, Y, Z)
fig = plt.figure()
ax = fig.gca(projection='3d')
for z in range(W.shape[0]):
    indexes = np.where(W[z])
    ax.scatter(X[indexes], Y[indexes], ???, marker='.')

ax.set_xlabel('X = columns')
ax.set_ylabel('Y = rows')
ax.set_zlabel('Z')
plt.show()

W是我的三维矩阵,因此: W [0],W [1]等是512x512矩阵。 我的问题是:我有什么要写的?在我的代码中。我知道我不应该问这个,但我无法理解这个想法。

1 个答案:

答案 0 :(得分:2)

你可以创建检查z层的f(x,y,z)的值,看它们是否为非零,然后根据它对该函数进行散点图。

e.g。对于nz(n,n)矩阵,每个矩阵都是一个球体:

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

n, nz = 48, 24
x, y = np.linspace(-n//2,n//2-1,n), np.linspace(-n//2,n//2-1,n)
X, Y = np.meshgrid(x, y)

def f(x,y,z):
    return (X**2 + Y**2 + (z-nz//2)**2) < (n*0.2)**2

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

for z in range(nz):
    layer = f(X, Y, z)
    indexes = np.where(layer)
    ax.scatter(X[indexes], Y[indexes], layer[indexes]*(z-nz//2), marker='.')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

enter image description here

对于f(x,y,z)的随机非零元素:

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

n, nz = 12, 10
x, y, z = np.linspace(0,n-1,n), np.linspace(0,n-1,n), np.linspace(0,nz-1,nz)
X, Y, Z = np.meshgrid(x, y, z)

f =  np.random.randint(2, size=(n,n,nz))

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

for z in range(nz):
    indexes = np.where(f[...,z])
    ax.scatter(X[indexes], Y[indexes], f[indexes]+z, marker='.')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

enter image description here

但是对于你的大型数组,你可能遇到问题(a)内存和绘图的速度,以及(b)能够解决中心&#34;中的问题。情节块。