情节表现得很奇怪

时间:2016-09-27 13:54:21

标签: python matplotlib

我试图在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变量启用后 - enter image description here

下面是从内部pos变量生成的图(在评论全局pos变量并保持posfor循环内启用后) - enter image description here

这种行为的原因是什么?

1 个答案:

答案 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)没有立即绘制数据。它仅存储对xlistylistzlist的引用,并在调用plt.show()时使用数据构建绘图。接下来,pos[:, 0]pos[:, 1]pos[:, 2]不会按值返回相应的列。相反,他们返回一些引用原始矩阵的代理对象。

结果,使用在最后一次迭代后最终在矩阵中的数据执行实际绘图,并且所有绘图重合。通过将pos[:, 0]pos[:, 1]pos[:, 2]中的每一个包裹在list()中,我们会强制复制列数据,从而将图解耦合。