Je rencontre des problèmes pour redessiner la figure ici. J'autorise l'utilisateur à spécifier les unités dans l'échelle de temps (axe des x), puis je recalcule et appelle cette fonction plots()
. Je veux que l'intrigue se mette simplement à jour, et non en ajoute une autre à la figure.
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
le surnom
la source
la source
Réponses:
Vous avez essentiellement deux options:
Faites exactement ce que vous faites actuellement, mais appelez
graph1.clear()
etgraph2.clear()
avant de reconstituer les données. C'est l'option la plus lente, mais la plus simple et la plus robuste.Au lieu de replotter, vous pouvez simplement mettre à jour les données des objets de tracé. Vous devrez apporter des modifications à votre code, mais cela devrait être beaucoup, beaucoup plus rapide que de reconstituer les choses à chaque fois. Cependant, la forme des données que vous tracez ne peut pas changer, et si la plage de vos données change, vous devrez réinitialiser manuellement les limites des axes x et y.
Pour donner un exemple de la deuxième option:
la source
clear
? Vous devriez appelergraph1.clear(); graph2.clear()
dans votrefor
boucle, juste avant d'appelergraph1.plot(...)
,graph2.plot(...)
etc ...fig.canvas.draw()
ouplt.draw()
après avoir tracé chaque image? (Vous devriez avoir une séquence declear
,plot
,draw
chaque fois que vous voulez montrer un cadre) Je devine, mais je pense que cela causerait exactement le comportement que vous décrivez ... Bonne chance, en tout cas!Vous pouvez également faire comme suit: Cela dessinera une matrice aléatoire de données 10x1 sur le tracé pendant 50 cycles de la boucle for.
la source
%matplotlib inline
dans le cahier Jupyter.plt.clf()
. Ohmatplotlib
, youCela a fonctionné pour moi. Appelle à plusieurs reprises une fonction mettant à jour le graphique à chaque fois.
"fun" est une fonction qui renvoie un entier. FuncAnimation appellera à plusieurs reprises "update", il le fera fois "xmax".
la source
Au cas où quelqu'un trouverait cet article à la recherche de ce que je cherchais, j'ai trouvé des exemples sur
Comment visualiser des données 2D scalaires avec Matplotlib?
et
http://mri.brechmos.org/2009/07/automatically-update-a-figure-in-a-loop (sur web.archive.org)
puis les a modifiés pour utiliser imshow avec une pile d'entrée de cadres, au lieu de générer et d'utiliser des contours à la volée.
En commençant par un tableau 3D d'images de forme (nBins, nBins, nBins), appelé
frames
.J'ai également trouvé un moyen beaucoup plus simple de gérer tout ce processus, bien que moins robuste:
Notez que les deux semblent fonctionner uniquement avec
ipython --pylab=tk
, akabackend = TkAgg
Merci pour l'aide avec tout.
la source
J'ai publié un package appelé python-drawnow qui fournit des fonctionnalités permettant de mettre à jour une figure, généralement appelée dans une boucle for, similaire à celle de Matlab
drawnow
.Un exemple d'utilisation:
Ce package fonctionne avec n'importe quelle figure matplotlib et fournit des options pour attendre après chaque mise à jour de la figure ou déposer dans le débogueur.
la source
Tout ce qui précède est peut-être vrai, mais pour moi, la "mise à jour en ligne" des chiffres ne fonctionne qu'avec certains backends, en particulier
wx
. Vous pouvez simplement essayer de changer cela, par exemple en démarrant ipython / pylab paripython --pylab=wx
! Bonne chance!la source
Cela a fonctionné pour moi:
la source