我想知道是否有可能使用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矩阵。 我的问题是:我有什么要写的?在我的代码中。我知道我不应该问这个,但我无法理解这个想法。
答案 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()
对于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()
但是对于你的大型数组,你可能遇到问题(a)内存和绘图的速度,以及(b)能够解决中心&#34;中的问题。情节块。