我正在尝试绘制一些 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])
与
ax.plot(list(pos[:, 0]), list(pos[:, 1]), list(pos[:, 2]))
并且它将按预期为全局 pos
工作。
解释
问题是 ax.plot(xlist, ylist, zlist)
不会立即绘制数据。它仅存储对 xlist
、ylist
和 zlist
的引用,并在 plt.show()
被调用。接下来,pos[:, 0]
、pos[:, 1]
和pos[:, 2]
不返回对应的列按值(value)。相反,它们返回一些引用原始矩阵的代理对象。
因此,实际绘图是使用最后一次迭代后矩阵中的数据执行的,并且所有绘图都重合。通过将每个 pos[:, 0]
、pos[:, 1]
和 pos[:, 2]
包装在一个 list()
我们强制复制列数据,将绘图彼此分离。
关于python - 剧情表现怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726583/