Python 情节很诡异
我正在尝试用3D绘制一些轨迹。我注意到plot函数的行为很奇怪 我定义了一个名为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
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])
与
而且,它将在globalpos
上正常工作
解释
问题在于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]))