Hoe kan ik mijn matplotlib-figuur dynamisch bijwerken terwijl het gegevensbestand verandert?

Ik heb een pythonscript dat een gegevensbestand voorleest en één cijfer met vier plots weergeeft met behulp van de matplotlib-bibliotheek. Het gegevensbestand wordt om de paar seconden bijgewerkt, omdat het een uitvoerbestand is voor een ander stuk software dat gelijktijdig wordt uitgevoerd. Ik wil graag dat de vier plots in mijn matplotlib-figuur zichzelf elke 20 seconden vernieuwen met behulp van het bijgewerkte gegevensbestand. De manier waarop ik dit heb geïmplementeerd is als volgt:

import pylab as pl
import time

pl.ion()
fig = pl.figure()
while True:
    f = open('data.out', 'rb')
    #code to parse data and plot four charts
    ax = fig.add_subplot(2,2,1)
    #...
    ax = fig.add_subplot(2,2,4)
    #...
    pl.draw()
    time.sleep(20)

Dit werkt, maar ik verlies de functionaliteit van de zoom- en pan-knoppen die normaal werken als pl.show() wordt aangeroepen. Dit is niet optimaal. Als pl.show() echter wordt vervangen door pl.draw (), worden de plots niet meer bijgewerkt door het script. Is er een manier om een ​​plot dynamisch bij te werken zonder de zoom/pan-functionaliteit volledig te verliezen?

7

2 antwoord

Gebruik een timer. De timingmethode die u gebruikt, is afhankelijk van de GUI-backend die u voor matplotlib gebruikt.

Here you have an example with wx that uses the wx.Timer class.

Er zijn nog andere voorbeelden van dynamische plots in de matplotlib-site.

1
toegevoegd

Je code is een beetje te vaag om te weten wat er aan de hand is.

Ik kan dit aanbieden: U moet de normale functionaliteit behouden als u uw subplots eenmaal maakt, alle assen-objecten opslaat en vervolgens show() aanroept.

Daaropvolgende wijzigingen in die subplots kunnen als volgt worden gedaan:

#inside while loop
for i in #subplotlist
    ax[i].clear()    #ax[i] is the axis object of the i'th subplot
    ax[i].plot(#plotstuff)
    ax[i].draw()

De werkbalk voor zoomen en pannen kan met de hand worden toegevoegd als u dat wenst.

0
toegevoegd