散布図を自動的に更新しようとしています。 XとYの値のソースは外部であり、データは予測されない時間間隔(ラウンド)でコードに自動的にプッシュされます。
プロセス全体が終了したときにすべてのデータをプロットすることしかできませんでしたが、キャンバスにデータを常に追加してプロットしようとしています。
私のコードの簡略版:
import matplotlib.pyplot as plt
def read_data():
#This function gets the values of xAxis and yAxis
xAxis = [some values] #these valuers change in each run
yAxis = [other values] #these valuers change in each run
plt.scatter(xAxis,yAxis, label = 'myPlot', color = 'k', s=50)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
Matplotlibプロットをアニメーション化するには、いくつかの方法があります。以下では、散布図を使用した2つの最小限の例を見てみましょう。
plt.ion()
アニメーションを実行するには、イベントループが必要です。イベントループを取得する1つの方法は、plt.ion()
( "interactive on")を使用することです。次に、最初に図を描画する必要があり、ループ内でプロットを更新できます。ループ内で、キャンバスを描画し、ウィンドウが他のイベント(マウス操作など)を処理するために少し休止する必要があります。この一時停止がないと、ウィンドウがフリーズします。最後に、plt.waitforbuttonpress()
を呼び出して、アニメーションが終了した後でもウィンドウを開いたままにします。
_import matplotlib.pyplot as plt
import numpy as np
plt.ion()
fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)
plt.draw()
for i in range(1000):
x.append(np.random.Rand(1)*10)
y.append(np.random.Rand(1)*10)
sc.set_offsets(np.c_[x,y])
fig.canvas.draw_idle()
plt.pause(0.1)
plt.waitforbuttonpress()
_
FuncAnimation
を使用する上記の多くは _matplotlib.animation.FuncAnimation
_ を使用して自動化できます。 FuncAnimationはループと再描画を処理し、一定の時間間隔が経過した後、常に関数(この場合はanimate()
)を呼び出します。アニメーションはplt.show()
が呼び出されると開始します。これにより、プロットウィンドウのイベントループで自動的に実行されます。
_import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)
def animate(i):
x.append(np.random.Rand(1)*10)
y.append(np.random.Rand(1)*10)
sc.set_offsets(np.c_[x,y])
ani = matplotlib.animation.FuncAnimation(fig, animate,
frames=2, interval=100, repeat=True)
plt.show()
_
私が理解していることから、あなたはあなたのプロットをインタラクティブに更新したいと思っています。その場合、散布図の代わりにプロットを使用して、このようにプロットのデータを更新できます。
import numpy
import matplotlib.pyplot as plt
fig = plt.figure()
axe = fig.add_subplot(111)
X,Y = [],[]
sp, = axe.plot([],[],label='toto',ms=10,color='k',marker='o',ls='')
fig.show()
for iter in range(5):
X.append(numpy.random.Rand())
Y.append(numpy.random.Rand())
sp.set_data(X,Y)
axe.set_xlim(min(X),max(X))
axe.set_ylim(min(Y),max(Y))
raw_input('...')
fig.canvas.draw()
これが探している動作である場合は、spのデータを追加する関数を作成し、その関数にプロットする新しいポイントを取得するだけです(I/O管理または通信プロセスを使用して)使用)。役に立てば幸いです。