matplotlib - Как вы сохраняете постоянные оси при добавлении новых данных?

Я использую matplotlib для отображения данных, которые постоянно обновляются (изменяется примерно 10 раз в секунду). Я использую трехмерную диаграмму рассеяния, и я хотел бы, чтобы оси были зафиксированы в определенном диапазоне, так как расположение данных относительно границ графика - это то, что важно.

В настоящее время всякий раз, когда я добавляю новые данные, оси сбрасываются до масштабирования по данным, а не по размеру, который я хочу (когда у меня есть 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. Нашел связанный вопрос, который также до сих пор не имеет ответ

1 ответ

Решение

Я хотел бы сделать что-то вроде этого (обратите внимание на удаление 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)

Где вы удаляете только добавленный график рассеяния каждый раз через цикл.

Другие вопросы по тегам