循环更新pyplot 3d散点图,网格线重叠点

NLi*_*0Me 6 python loops scatter matplotlib

我正在使用循环的每次迭代更新 3d 散点图。重绘绘图时,网格线“穿过”或“覆盖”点,这使我的数据更难以可视化。如果我构建单个 3d 绘图(无循环更新),则不会发生这种情况。下面的代码演示了最简单的情况:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time

X = np.random.rand(100, 3)*10
Y = np.random.rand(100, 3)*5

plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2])
plt.draw()

for i in range(0, 20):
    time.sleep(3)   #make changes more apparent/easy to see

    Y = np.random.rand(100, 3)*5
    ax.cla()    
    ax.scatter(Y[:, 0], Y[:, 1], Y[:, 2])
    plt.draw()
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到过这个问题?

mga*_*gab 7

看起来MaxNoe是正确的,因为问题出在ax.cla()orplt.cla()调用中。事实上,这似乎是一个已知问题

然后有一个问题,因为清除轴方法在 3D 图中不起作用,并且对于 3D 散点,没有干净的方法来更改数据点的坐标(a la sc.set_data(new_values)),如该邮件列表中所述(我没有) t 找到任何更新的内容)。

但是,在邮件列表中,Ben Roon 指出了一个可能对您也有用的解决方法。

解决方法:

您需要在函数返回_ofsets3dLine3DCollection对象的内部变量中设置数据点的新坐标scatter

您改编的示例如下所示:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time

X = np.random.rand(100, 3)*10
Y = np.random.rand(100, 3)*5

plt.ion()

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
sc = ax.scatter(X[:, 0], X[:, 1], X[:, 2])
fig.show()

for i in range(0, 20):
    plt.pause(1)

    Y = np.random.rand(100, 3)*5

    sc._offsets3d = (Y[:,0], Y[:,1], Y[:,2])
    plt.draw()
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道,也可以更改循环每次迭代中要绘制的元素数量:`Y = np.random.rand(np.random.randint(200), 3)*5` 效果很好 (2认同)