绘制多条3D线:数据转换

时间:2013-07-01 21:26:00

标签: python numpy matplotlib mplot3d

我想在Python中绘制3D绘图中的多行。我的输入包括两个n x 3数组,比如pos1和pos2,对应于两个3D点列表(row = x,y,z坐标)。我需要绘制一条线,将pos1中的第i个点连接到pos2中的第i个点,每个i。

我有工作代码,但我确信它很糟糕,并且有更好的方法来实现它。

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

# get plot set up
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')

# minimal working example: two pairs.
pos1 = np.array([[0,0,0],[2,2,2]])
pos2 = np.array([[1,1,1],[3,3,3]])

xvals = np.transpose(np.array([pos1[:,0], pos2[:,0]]))
yvals = np.transpose(np.array([pos1[:,1], pos2[:,1]]))
zvals = np.transpose(([pos1[:,2], pos2[:,2]]))

N = len(pos1)

# call plot on each line
for i in range(N):
    ax.plot(xvals[i],yvals[i],zvals[i])

plt.show()

具体来说,我认为没有必要定义三个中间数组xvals, yvals, zvals。有更清洁的替代方案吗?例如,我应该passing a listplot吗?

1 个答案:

答案 0 :(得分:2)

我之前从未做过3D绘图,所以我不能说这是否是使用matplotlib提供的工具的最佳方法。但是你可以充分利用zip函数。

pos1 = np.array([[0,0,0],[2,2,2]])
pos2 = np.array([[1,1,1],[3,3,3]])

for point_pairs in zip(pos1, pos2):
    xs, ys, zs = zip(*point_pairs)
    ax.plot(xs, ys, zs)