如何修改 matplotlib 中 3D 散点图的 xyz 数据以实现快速在线动画?换句话说,matplotlib patchcollection3d 对象在哪里保存 xyz 坐标,以及如何设置它们?例如:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
## generate some random data
pts = np.random.uniform(0,10,(10,20,30))
plt.close('all')
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
patch_collection_instance = ax.scatter(pts[:,0],pts[:,1],pts[:,2], c='m', marker='o')
例如,如果我想将所有点平移随机量,那么接下来我该如何处理 patch_collection_instance?
最佳答案
坐标存储在属性_offsets3d
中。虽然有 get_offsets()
方法和 set_offsets()
方法,但这些方法似乎是从 2d 版本继承的,并且不能正常用于 3d。 _offsets3d
包含 x、y 和 z 坐标元组的元组。假设您想要将每个点在 x 方向上移动 10。您可以将 10 添加到 x 坐标元组中的每个数字,然后将 _offsets3d 设置为新元组。
我不确定这是否比仅清除图形并使用新坐标再次调用 scatter
更快,这应该具有相同的效果。
示例代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np
from copy import copy
## generate some random data
pts = np.random.uniform(0,10,(10,20,30))
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
patch_collection_instance = ax.scatter(pts[:,0],pts[:,1], pts[:,2], c='m', marker='o')
x, y, z = patch_collection_instance._offsets3d
print x
x = [i + 10 for i in x]
offsets = (x, y, z)
patches2 = copy(patch_collection_instance)
patches2._offsets3d = offsets
patches2._facecolor3d = [[0, 0, 1, 1]]
ax.add_collection3d(patches2)
plt.xlim(0, 20)
plt.show()
关于python - 修改matplotlib patchcollecton3d数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32034200/