matplotlib 如何在添加新数据时保持轴不变?

mec1mxoz  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(170)

我使用matplotlib来显示不断更新的数据(大约每秒改变10次)。我使用的是3D散点图,我希望轴固定在一个特定的范围内,因为数据相对于图边缘的位置是很重要的。
目前,每当我添加新数据时,轴将重置为由数据缩放,而不是我想要的大小(当我有hold=False时)。如果我设置hold=True,轴将保持正确的大小,但新数据将覆盖在旧数据上,这不是我想要的。
我可以让它工作,如果我重新缩放轴每次我得到新的数据,但这似乎是一个低效的方式来做到这一点,特别是因为我需要再次执行所有其他格式以及(添加标题,图例等)
是否有某种方法可以让我只指定一次图的属性,并且在添加新数据时,这将保持不变?
下面是我代码的一个粗略大纲,以帮助解释我的意思:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

X_MAX = 50
Y_MAX = 50
Z_MAX = 50

fig = plt.figure(1)
ax = fig.add_subplot(111, projection='3d')
ax.set_title("My Title")
ax.set_xlim3d([0, X_MAX])
ax.set_ylim3d([0, Y_MAX])
ax.set_zlim3d([0, Z_MAX])
ax.set_autoscale_on(False)
# This is so the new data replaces the old data
# seems to be replacing the axis ranges as well, maybe a different method should be used?
ax.hold(False)

plt.ion()
plt.show()

a = 0
while a < 50:
  a += 1
  ax.scatter( a, a/2+1, 3, s=1 )
  # If I don't set the title and axes ranges again here, they will be reset each time
  # I want to know if there is a way to only set them once and have it persistent
  ax.set_title("My Title")
  ax.set_xlim3d([0, X_MAX])
  ax.set_ylim3d([0, Y_MAX])
  ax.set_zlim3d([0, Z_MAX])
  plt.pause(0.001)

编辑:1.我也尝试过ax.set_autoscale_on(False),但没有成功2.我用常规的2D散点图尝试了这一点,同样的问题仍然存在3.找到一个related question,它仍然没有答案

1cosmwyk

1cosmwyk1#

我会这样做(注意删除hold(False)):

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

X_MAX = 50
Y_MAX = 50
Z_MAX = 50
fig = plt.figure(1)
ax = fig.add_subplot(111, projection='3d')
ax.set_title("My Title")
ax.set_xlim3d([0, X_MAX])
ax.set_ylim3d([0, Y_MAX])
ax.set_zlim3d([0, Z_MAX])
ax.set_autoscale_on(False)
plt.ion()
plt.show()

a = 0
sct = None
while a < 50:
  a += 1
  if sct is not None:
      sct.remove()
  sct = ax.scatter( a, a/2+1, 3, s=1 )
  fig.canvas.draw()
  plt.pause(0.001)

在这里,每次循环过程中,您都删除 * 只是 * 添加的散点图。

相关问题