Saya mengalami masalah dengan menggambar ulang gambar di sini. Saya mengizinkan pengguna untuk menentukan unit dalam skala waktu (sumbu x) dan kemudian saya menghitung ulang dan memanggil fungsi ini plots()
. Saya ingin plot hanya memperbarui, tidak menambahkan plot lain pada gambar.
def plots():
global vlgaBuffSorted
cntr()
result = collections.defaultdict(list)
for d in vlgaBuffSorted:
result[d['event']].append(d)
result_list = result.values()
f = Figure()
graph1 = f.add_subplot(211)
graph2 = f.add_subplot(212,sharex=graph1)
for item in result_list:
tL = []
vgsL = []
vdsL = []
isubL = []
for dict in item:
tL.append(dict['time'])
vgsL.append(dict['vgs'])
vdsL.append(dict['vds'])
isubL.append(dict['isub'])
graph1.plot(tL,vdsL,'bo',label='a')
graph1.plot(tL,vgsL,'rp',label='b')
graph2.plot(tL,isubL,'b-',label='c')
plotCanvas = FigureCanvasTkAgg(f, pltFrame)
toolbar = NavigationToolbar2TkAgg(plotCanvas, pltFrame)
toolbar.pack(side=BOTTOM)
plotCanvas.get_tk_widget().pack(side=TOP)
python
matplotlib
tkinter
laluickname
sumber
sumber
Jawaban:
Anda pada dasarnya memiliki dua opsi:
Lakukan persis apa yang sedang Anda lakukan, tetapi panggil
graph1.clear()
dangraph2.clear()
sebelum mengganti data. Ini adalah opsi paling lambat, tetapi paling sederhana dan paling kuat.Alih-alih mengganti, Anda bisa memperbarui data objek plot. Anda harus membuat beberapa perubahan dalam kode Anda, tetapi ini harus jauh, lebih cepat daripada mengganti hal-hal setiap saat. Namun, bentuk data yang Anda rencanakan tidak dapat berubah, dan jika rentang data Anda berubah, Anda harus mengatur ulang batas sumbu x dan y secara manual.
Untuk memberikan contoh opsi kedua:
sumber
clear
? Anda harus menelepongraph1.clear(); graph2.clear()
di dalamfor
lingkaran Anda , tepat sebelum menelepongraph1.plot(...)
,graph2.plot(...)
dll ...fig.canvas.draw()
atauplt.draw()
setelah merencanakan setiap frame? (Yaitu Anda harus memiliki urutanclear
,plot
,draw
setiap kali Anda ingin menampilkan frame) aku menebak, tapi saya pikir itu akan menyebabkan persis perilaku Anda menggambarkan ... Good luck, pada setiap tingkat!Anda juga dapat melakukan hal-hal berikut: Ini akan menggambar data matriks acak 10x1 pada plot selama 50 siklus dari for loop.
sumber
%matplotlib inline
di notebook Jupyter juga.plt.clf()
. Ohmatplotlib
, kau bajingan :)Ini berhasil untuk saya. Berulang kali memanggil fungsi yang memperbarui grafik setiap saat.
"fun" adalah fungsi yang mengembalikan integer. FuncAnimation akan berulang kali memanggil "pembaruan", itu akan melakukan itu "xmax" kali.
sumber
Jika ada orang yang menemukan artikel ini untuk mencari apa yang saya cari, saya menemukan contoh di
Bagaimana cara memvisualisasikan data 2D skalar dengan Matplotlib?
dan
http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (di web.archive.org)
kemudian memodifikasinya untuk menggunakan imshow dengan tumpukan input bingkai, alih-alih menghasilkan dan menggunakan kontur dengan cepat.
Dimulai dengan array 3D gambar bentuk (nBins, nBins, nBins), disebut
frames
.Saya juga menemukan cara yang lebih sederhana untuk menyelesaikan seluruh proses ini, meskipun kurang kuat:
Perhatikan bahwa kedua ini sepertinya hanya bekerja dengan
ipython --pylab=tk
aliasbackend = TkAgg
Terima kasih atas bantuannya untuk semuanya.
sumber
Saya telah merilis paket yang disebut python-drawow yang menyediakan fungsionalitas untuk membiarkan pembaruan angka, biasanya disebut dalam for loop, mirip dengan Matlab
drawnow
.Contoh penggunaan:
Paket ini berfungsi dengan semua figur matplotlib dan menyediakan opsi untuk menunggu setelah setiap pembaruan angka atau jatuh ke debugger.
sumber
Semua hal di atas mungkin benar, namun bagi saya "pemutakhiran online" angka hanya bekerja dengan beberapa backend, khususnya
wx
. Anda mungkin mencoba mengubah ini, misalnya dengan memulai ipython / pylab denganipython --pylab=wx
! Semoga berhasil!sumber
Ini bekerja untuk saya:
sumber