Saya ingin memplot data dalam lingkaran untuk membangkitkan "pembaruan langsung" dari data baru. Tetapi saya hanya mendapatkan satu pembaruan dari plot saya dan tidak ada data lain yang ditambahkan ke plot. Apa yang saya lakukan salah?

import numpy as np
import matplotlib.pyplot as plt
import time

fig=plt.figure()
ax1=fig.add_subplot(1,1,1)

x=[]
y=[]

for n in range(20):
    x.append(n)
    y.append(n*2)
    ax1.clear()
    ax1.scatter(x,y)
    #fig.canvas.draw()
    plt.autoscale(enable=True, axis='both')
    plt.show()

    time.sleep(0.1)
1
WITC 11 April 2020, 23:42

1 menjawab

Jawaban Terbaik

Anda harus menggunakan FuncAnimation. Ini akan menjadi implementasi untuk contoh Anda -

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time

fig=plt.figure()
ax1=fig.add_subplot(1,1,1)

x=list(range(20))
y=[n*2 for n in x]

def animate(i):
    ax1.clear()
    ax1.scatter(x[:i],y[:i])
    plt.autoscale(enable=True, axis='both')

ani = FuncAnimation(fig, animate, interval=100)
plt.show()

Memperbarui

Untuk bekerja dengan data yang tidak dapat dihitung sebelumnya dalam array seperti yang ditunjukkan di atas, Anda dapat menggunakan argumen frame dari FuncAnimation seperti di bawah ini -

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time

fig=plt.figure()
ax1=fig.add_subplot(1,1,1)

x=[]
y=[]

def frames():
    for i in range(20):
        yield i, i*2

def animate(args):
    ax1.clear()
    x.append(args[0])
    y.append(args[1])
    ax1.scatter(x, y)
    plt.autoscale(enable=True, axis='both')

ani = FuncAnimation(fig, animate, frames=frames, interval=100)
plt.show()
3
Vivek Roy 13 April 2020, 00:15