如何在Matplotlib中修改已构建的3D散点图数据?
解决Matplotlib 3D散点图单个数据点坐标更新问题
在Matplotlib里创建单个3D散点数据点后,会发现常规的set_data、set_offsets方法没法修改x、y坐标,只有set_3d_properties能改z值,甚至直接操作_offsets3d属性还会抛出IndexError。这是因为3D散点返回的PathCollection对坐标存储格式有特殊要求。
正确修改方式
直接修改_offsets3d属性,但必须传入三个包含单个元素的可迭代对象(比如列表),而非标量或普通列表。示例代码如下:
import matplotlib matplotlib.use("TkAgg") import matplotlib.pyplot as plt plt.ion() fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(111, projection='3d') size = 6 ax.set_xlim(-(size / 2), size / 2) ax.set_ylim(-(size / 2), size / 2) ax.set_zlim(-(size / 2), size / 2) datapoint = ax.scatter(0,0,0) # 正确修改x、y、z坐标 datapoint._offsets3d = ([1], [1], [5]) plt.show()
动态模拟场景示例
如果要实现动态更新的模拟效果,配合plt.draw()和plt.pause()即可:
import matplotlib matplotlib.use("TkAgg") import matplotlib.pyplot as plt plt.ion() fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(111, projection='3d') size = 6 ax.set_xlim(-(size / 2), size / 2) ax.set_ylim(-(size / 2), size / 2) ax.set_zlim(-(size / 2), size / 2) datapoint = ax.scatter(0,0,0) # 循环更新坐标实现动态效果 for step in range(10): new_x = step * 0.5 - 2.5 new_y = step * 0.5 - 2.5 new_z = step * 0.5 - 2.5 # 更新坐标 datapoint._offsets3d = ([new_x], [new_y], [new_z]) plt.draw() plt.pause(0.3) plt.ioff() plt.show()
报错原因说明
之前操作_offsets3d报错,是因为赋值格式不符合要求。_offsets3d要求传入(x_list, y_list, z_list)的结构,哪怕是单个点,每个坐标也得是包含一个元素的列表/元组,不能直接传(1,1,5)这种标量组合。
内容的提问来源于stack exchange,提问作者I Me
相关产品推荐
相关产品推荐

