python - 剧情表现怪异

标签 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 = 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 变量已启用)- enter image description here

下面是从内部 pos 变量生成的图(在注释全局 pos 变量并保持 pos 定义在 for 循环启用)- enter image description here

这种行为的原因是什么?

最佳答案

修复

替换行

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]不返回对应的列按值(value)。相反,它们返回一些引用原始矩阵的代理对象。

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

关于python - 剧情表现怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726583/

相关文章:

python:判断一个类是否嵌套

python - 当图形大小更改时,Matplotlib 给出错误的刻度标签值

python - 有没有一种使用 Python Matplotlib 在分组箱线图上显示样本大小的好方法

python - 推广 PyQt 小部件

python - 如何在 django ModelForm 外键中设置默认选定值

python - Python 中带有渐变背景的点图?

python - 直接在图表上可视化 matplotlib 直方图 bin 计数

python - Matplotlib/Seaborn 不同数据大小的 fiddle 图

python - 在更新值时扩展 numpy 数组

python - 如何让pandas.Series.str.get_dummies() 报NaN?