web-dev-qa-db-ja.com

python matplotlib update関数からの散布図

散布図を自動的に更新しようとしています。 XとYの値のソースは外部であり、データは予測されない時間間隔(ラウンド)でコードに自動的にプッシュされます。

プロセス全体が終了したときにすべてのデータをプロットすることしかできませんでしたが、キャンバスにデータを常に追加してプロットしようとしています。

(実行全体の最後に)取得するのは次のとおりです。 enter image description here

一方、私が求めているのはこれです: enter image description here

私のコードの簡略版:

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()
10
Yair

Matplotlibプロットをアニメーション化するには、いくつかの方法があります。以下では、散布図を使用した2つの最小限の例を見てみましょう。

(a)対話モードを使用する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()
_

(b)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管理または通信プロセスを使用して)使用)。役に立てば幸いです。

3
aTben0