Python matplotlib-如何在添加新数据时保持轴恒定?

Python matplotlib-如何在添加新数据时保持轴恒定?,python,python-2.7,matplotlib,Python,Python 2.7,Matplotlib,我使用matplotlib显示不断更新的数据(大约每秒更改10次)。我正在使用一个3D散点图,我希望轴被固定到一个特定的范围,因为数据相对于图的边缘的位置是重要的 当前,每当我添加新数据时,轴将重置为按数据缩放,而不是按我想要的大小(当我保持=False时)。如果我设置hold=True,轴将保持正确的大小,但新数据将覆盖在旧数据上,这不是我想要的 如果每次我获得新数据时都重新缩放轴,我可以让它工作,但这似乎是一种效率低下的方法,特别是因为我还需要重新进行所有其他格式设置(添加标题、图例等) 是

我使用matplotlib显示不断更新的数据(大约每秒更改10次)。我正在使用一个3D散点图,我希望轴被固定到一个特定的范围,因为数据相对于图的边缘的位置是重要的

当前,每当我添加新数据时,轴将重置为按数据缩放,而不是按我想要的大小(当我保持=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)
导入matplotlib.pyplot作为plt
从mpl_toolkits.mplot3d导入Axes3D
X_MAX=50
Y_MAX=50
Z_MAX=50
图=plt.图(1)
ax=图添加_子图(111,投影='3d')
ax.设置标题(“我的标题”)
ax.set_xlim3d([0,X_MAX])
ax.set_ylim3d([0,Y_MAX])
ax.set_zlim3d([0,Z_MAX])
ax.set_autoscale_on(假)
#因此,新数据将替换旧数据
#似乎正在替换轴范围,也许应该使用不同的方法?
ax.hold(错误)
plt.ion()
plt.show()
a=0
当a<50时:
a+=1
最大散射(a,a/2+1,3,s=1)
#如果我不在这里再次设置标题和轴范围,每次都会重置它们
#我想知道是否有一种方法可以只设置它们一次并使其持久化
ax.设置标题(“我的标题”)
ax.set_xlim3d([0,X_MAX])
ax.set_ylim3d([0,Y_MAX])
ax.set_zlim3d([0,Z_MAX])
plt.暂停(0.001)
编辑: 1.我也尝试过ax.set_autoscale_on(False),但没有成功 2.我用一个普通的二维散点图试过了,同样的问题仍然存在
3.发现一个仍然没有答案的问题

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

导入matplotlib.pyplot作为plt
从mpl_toolkits.mplot3d导入Axes3D
X_MAX=50
Y_MAX=50
Z_MAX=50
图=plt.图(1)
ax=图添加_子图(111,投影='3d')
ax.设置标题(“我的标题”)
ax.set_xlim3d([0,X_MAX])
ax.set_ylim3d([0,Y_MAX])
ax.set_zlim3d([0,Z_MAX])
ax.set_autoscale_on(假)
plt.ion()
plt.show()
a=0
sct=无
当a<50时:
a+=1
如果sct不是无:
sct.remove()
sct=最大散射(a,a/2+1,3,s=1)
图canvas.draw()
plt.暂停(0.001)

每次循环时只删除添加的散点图。

您看过了吗?根据@BrenBarn的评论,我会在
循环时(或者在
plt.show()之前)测试
ax.set\u autoscale\u on(False)
。我曾尝试在一些地方使用ax.set\u autoscale\u on(False),以及ax.autoscale(False),但仍然没有luckMatplotlib也有一个,看看,可能会有帮助。谢谢你的建议。看起来动画模块希望您在启动动画时所有数据都可用,但对于我的用例,数据是实时流入的,可能不是恒定速率。不过,它对重放数据仍然有用。这似乎起到了作用,谢谢!还需要注意的是,除非删除ax.hold(False),否则这将不起作用,因为旧绘图已被删除,因此不再需要它。在某个时候,我会抽出时间来测试这两种方法之间的时差。这对我来说不起作用。我收到错误消息
TypeError:remove()只接受一个参数(给定0)
。(matplotlib 1.4.3)@StephenBosch这太神秘了,请用一个最小的(非)工作示例来回答一个新问题。我刚刚测试了这个(并更新了缺少行的答案),它适合我(在接近master的版本上)。
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)