我试图在3D中绘制一些轨迹。我注意到情节功能表现得很奇怪。
我定义了一个名为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
时,绘图不会绘制外观。我注意到在pos
循环中定义for
,解决问题。这对我来说很奇怪。
下面是从全局pos
变量生成的图(在评论pos
循环内for
循环并保持全局pos
变量启用后 -
下面是从内部pos
变量生成的图(在评论全局pos
变量并保持pos
在for
循环内启用后) -
这种行为的原因是什么?
答案 0 :(得分:1)
替换
行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]
不会按值返回相应的列。相反,他们返回一些引用原始矩阵的代理对象。
结果,使用在最后一次迭代后最终在矩阵中的数据执行实际绘图,并且所有绘图重合。通过将pos[:, 0]
,pos[:, 1]
和pos[:, 2]
中的每一个包裹在list()
中,我们会强制复制列数据,从而将图解耦合。