Python 情节很诡异

Python 情节很诡异,python,matplotlib,Python,Matplotlib,我正在尝试用3D绘制一些轨迹。我注意到plot函数的行为很奇怪 我定义了一个名为pos的变量,它是一个二维矩阵。它有3列,每列代表一个坐标轴。请参阅下面的完整代码- import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D max = 1.0 min = -1.0 cols = 3 goals = 4 timesteps

我正在尝试用3D绘制一些轨迹。我注意到plot函数的行为很奇怪

我定义了一个名为
pos
的变量,它是一个二维矩阵。它有3列,每列代表一个坐标轴。请参阅下面的完整代码-

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

max = 1.0
min = -1.0
cols = 3
goals = 4
timesteps = 20

#pos = np.zeros((timesteps, cols)) # this doesn't works hence commented

fig = plt.figure()
ax = fig.gca(projection='3d')
for i in range(goals):
    pos = np.zeros((timesteps, cols)) # this works as expected
    for t in range(timesteps):
        pos[t] = np.random.uniform(low=min, high=max, size=cols)
    ax.plot(pos[:, 0], pos[:, 1], pos[:, 2])

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
当全局定义
pos
时,绘图不会绘制所有内容。我注意到在
for
循环中定义
pos
,解决了这个问题。我觉得很奇怪

下面是从全局
pos
变量生成的曲线图(对
for
循环中定义的
pos
进行注释并保持全局
pos
变量处于启用状态后)-

下面是由内部
pos
变量生成的曲线图(在注释全局
pos
变量并保持
pos
中定义的
for
循环处于启用状态后)-

这种行为的原因是什么?

修复程序 更换线路

ax.plot(pos[:, 0], pos[:, 1], pos[:, 2])

而且,它将在global
pos
上正常工作

解释 问题在于
ax.plot(xlist、ylist、zlist)
不会立即绘制数据。它仅存储对
xlist
ylist
zlist
的引用,并在调用
plt.show()
时使用数据构建绘图。接下来,
pos[:,0]
pos[:,1]
pos[:,2]
不按值返回相应的列。相反,它们返回一些引用原始矩阵的代理对象


因此,使用最后一次迭代后在矩阵中结束的数据执行实际绘图,并且所有绘图都一致。通过将
pos[:,0]
pos[:,1]
pos[:,2]
包装在
list()
中,我们强制复制列数据,从而使绘图彼此分离。

非常好。这个解释很有趣。谢谢。
ax.plot(list(pos[:, 0]), list(pos[:, 1]), list(pos[:, 2]))