4

matplotlib を使用して、常に更新されているデータを表示しています (1 秒あたり約 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.まだない関連する質問を見つけました答え

4

1 に答える 1

6

私はこのようなことをします(の削除に注意してください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)

ループを通過するたびに、追加された散布図だけを削除する場所。

于 2013-06-11T21:23:11.300 に答える