Tworzę aplikację w Pythonie, która zbiera dane z portu szeregowego i rysuje wykres zebranych danych względem czasu przybycia. Czas przybycia danych jest niepewny. Chcę, aby fabuła była aktualizowana po otrzymaniu danych. Szukałem, jak to zrobić i znalazłem dwie metody:
- Wyczyść wykres i ponownie narysuj wykres ze wszystkimi punktami.
- Animuj wykres, zmieniając go po określonym czasie.
Nie preferuję pierwszego, ponieważ program działa i zbiera dane przez długi czas (na przykład dzień), a przerysowanie wykresu będzie dość powolne. Drugi również nie jest preferowany, ponieważ czas nadejścia danych jest niepewny i chcę, aby wykres aktualizował się tylko po otrzymaniu danych.
Czy istnieje sposób, w jaki mogę zaktualizować wykres, dodając do niego więcej punktów tylko po otrzymaniu danych?
python
matplotlib
tkinter
Shadman Anwer
źródło
źródło
Odpowiedzi:
Istnieje wiele sposobów animowania danych w matplotlib, w zależności od posiadanej wersji. Czy widziałeś przykłady książek kucharskich matplotlib ? Sprawdź również bardziej nowoczesne przykłady animacji w dokumentacji matplotlib. Wreszcie interfejs API animacji definiuje funkcję FuncAnimation, która animuje funkcję w czasie. Ta funkcja może być po prostu funkcją, której używasz do pozyskiwania danych.
Każda metoda zasadniczo ustawia
data
właściwość rysowanego obiektu, więc nie wymaga czyszczenia ekranu ani figury.data
Nieruchomość może być po prostu przedłużony, dzięki czemu można zachować dotychczasowe punkty i po prostu dodanie do linii (lub obraz lub czymkolwiek jesteś rysunek).Biorąc pod uwagę, że mówisz, że czas nadejścia danych jest niepewny, najlepszym rozwiązaniem jest prawdopodobnie zrobienie czegoś takiego:
Wtedy gdy otrzymasz dane z portu szeregowego po prostu zadzwoń
update_line
.źródło
Aby to zrobić bez FuncAnimation (np. Chcesz wykonać inne części kodu podczas tworzenia wykresu lub chcesz zaktualizować kilka wykresów w tym samym czasie),
draw
samo wywołanie nie generuje wykresu (przynajmniej z qt backend).U mnie działa:
źródło
%matplotlib notebook
magiczne polecenie po instrukcji importu matplotlib.Oto sposób, który pozwala usunąć punkty po wykreśleniu określonej liczby punktów:
źródło
Wiem, że spóźniłem się z odpowiedzią na to pytanie, ale w swoim problemie możesz zajrzeć do pakietu „joystick”. Zaprojektowałem go do wykreślania strumienia danych z portu szeregowego, ale działa dla każdego strumienia. Umożliwia także interaktywne rejestrowanie tekstu lub kreślenie obrazu (oprócz kreślenia wykresów). Nie musisz robić własnych pętli w osobnym wątku, pakiet dba o to, po prostu podaj żądaną częstotliwość aktualizacji. Ponadto terminal pozostaje dostępny do monitorowania poleceń podczas kreślenia. Zobacz http://www.github.com/ceyzeriat/joystick/ lub https://pypi.python.org/pypi/joystick (użyj pip install joystick, aby zainstalować)
Wystarczy zamienić np.random.random () na Twój rzeczywisty punkt danych odczytany z portu szeregowego w poniższym kodzie:
źródło