Po tych instrukcjach w interpretatorze Pythona pojawia się okno z wykresem:
from matplotlib.pyplot import *
plot([1,2,3])
show()
# other code
Niestety nie wiem, jak kontynuować interaktywne badanie postaci stworzonej przez, show()
gdy program wykonuje dalsze obliczenia.
Czy to w ogóle możliwe? Czasami obliczenia są długie i pomogłoby, gdyby kontynuowano je podczas badania wyników pośrednich.
python
matplotlib
plot
meteore
źródło
źródło
ion()
rozwiązuje problem.os.fork()
ale pamiętaj, że korzystanie z niegoos.fork()
może być trudne, ponieważ tworzysz nowy proces, kopiując stary proces.Odpowiedzi:
Użyj
matplotlib
połączeń, które nie będą blokować:Używanie
draw()
:Korzystanie z trybu interaktywnego:
źródło
draw()
nie działa dla mnie, nie otwiera żadnego okna. Jednak używanieshow(block=False)
zamiastdraw()
wydaje się załatwić sprawę w matplotlib 1.1.draw()
też nie działało dla mnie, tylkopause(0.001)
: stackoverflow.com/questions/28269157/…Użyj słowa kluczowego „blok”, aby zastąpić blokowanie, np
aby kontynuować kod.
źródło
Lepiej zawsze sprawdzać w używanej bibliotece, czy obsługuje ona użycie w sposób nieblokujący .
Ale jeśli chcesz bardziej ogólnego rozwiązania lub jeśli nie ma innego sposobu, możesz uruchomić wszystko, co blokuje w oddzielnym procesie, używając
multprocessing
modułu zawartego w pythonie. Obliczenia będą kontynuowane:Że ma napowietrznej rozpoczęcie nowego procesu, a czasami jest trudniejsze do debugowania złożonych scenariuszy, więc wolałbym inne rozwiązanie (przy użyciu
matplotlib
„s nonblocking wywołań API )źródło
if __name__ == '__main__':
?Próbować
show()
Dokumentacja mówi:źródło
WAŻNE : aby coś wyjaśnić. Zakładam, że polecenia znajdują się w
.py
skrypcie i skrypt jest wywoływany przy użyciu np.python script.py
Z konsoli.Prosty sposób, który działa dla mnie to:
Przykład
script.py
pliku:źródło
Możesz przeczytać ten dokument w
matplotlib
dokumentacji zatytułowanej:Używanie matplotlib w powłoce pytona
źródło
W moim przypadku chciałem, aby pojawiło się kilka okien podczas ich obliczania. Dla porównania:
PS. Dość przydatny przewodnik po interfejsie OO matplotlib .
źródło
Cóż, miałem wielki problem z rozszyfrowaniem poleceń nieblokujących ... Ale w końcu udało mi się przerobić przykład „ Książka kucharska / Matplotlib / Animacje - Animowanie wybranych elementów fabuły ”, więc działa z wątkami ( i przesyła dane między wątkami albo przez zmienne globalne lub przez proces wieloprocesowy
Pipe
) w Python 2.6.5 w Ubuntu 10.04.Skrypt można znaleźć tutaj: Animating_selected_plot_elements-thread.py - inaczej wklejony poniżej ( z mniejszą liczbą komentarzy ) w celach informacyjnych:
Mam nadzieję, że to komuś pomoże,
zdrowie!
źródło
W wielu przypadkach wygodniej jest zapisać obraz jako plik .png na dysku twardym. Oto dlaczego:
Zalety:
Wada:
źródło
Jeśli pracujesz w konsoli, tzn.
IPython
Możesz użyć,plt.show(block=False)
jak wskazano w innych odpowiedziach. Ale jeśli jesteś leniwy, możesz po prostu wpisać:Który będzie taki sam.
źródło
Musiałem także dodać
plt.pause(0.001)
do mojego kodu, aby naprawdę działał w pętli for (w przeciwnym razie pokazywałby tylko pierwszy i ostatni wykres):źródło
W moim systemie show () nie blokuje się, chociaż chciałem, aby skrypt czekał na interakcję użytkownika z wykresem (i zbieranie danych za pomocą wywołań zwrotnych „pick_event”) przed kontynuowaniem.
Aby zablokować wykonywanie do momentu zamknięcia okna wydruku, użyłem następujących opcji:
Należy jednak pamiętać, że canvas.start_event_loop_default () wygenerował następujące ostrzeżenie:
chociaż skrypt nadal działał.
źródło
Chciałem również, aby moje wykresy wyświetlały się, uruchamiając resztę kodu (a następnie wyświetlając dalej), nawet jeśli wystąpi błąd (czasami używam wykresów do debugowania). Zakodowałem ten mały hack, aby wszystkie wątki w tym
with
oświadczeniu zachowywały się jako takie.Jest to prawdopodobnie nieco zbyt niestandardowe i niewskazane dla kodu produkcyjnego. W tym kodzie jest prawdopodobnie wiele ukrytych „gotchas”.
Jeśli / kiedy zaimplementuję właściwe „utrzymuj otwarte wykresy (nawet jeśli wystąpi błąd) i zezwól na wyświetlanie nowych wykresów”, chciałbym, aby skrypt poprawnie zakończył działanie, jeśli żadna interwencja użytkownika nie powie inaczej (dla celów wykonywania wsadowego).
Mogę użyć czegoś w rodzaju pytania „Koniec skryptu! \ NNaciśnij p, jeśli chcesz, aby wyniki wydruku zostały wstrzymane (masz 5 sekund):” /programming/26704840/corner -cases-for-my-wait-for-user-input-interruption-Implementation .
źródło
źródło
OP pyta o detatching
matplotlib
plots. Większość odpowiedzi zakłada wykonanie polecenia z interpretera python. Przypadek użycia przedstawiony tutaj to moja preferencja do testowania kodu w terminalu (np. Bash), w którymfile.py
uruchamiany jest a, a chcesz, aby wykresy pojawiały się, ale skrypt python musi się zakończyć i powrócić do wiersza poleceń.Ten autonomiczny plik służy
multiprocessing
do uruchomienia osobnego procesu drukowania danychmatplotlib
. Główny wątek kończy się przy użyciuos._exit(1)
wspomnianego w tym poście. Teos._exit()
siły główne, aby wyjść ale pozostawiamatplotlib
proces dziecko żyje i reagujących aż okno działka jest zamknięta. To całkowicie osobny proces.To podejście przypomina trochę sesję programistyczną Matlab z oknami figury, które zawierają responsywny wiersz polecenia. Dzięki takiemu podejściu utraciłeś cały kontakt z procesem okna figury, ale jest to odpowiednie do programowania i debugowania. Po prostu zamknij okno i kontynuuj testowanie.
multiprocessing
jest przeznaczony do wykonywania kodu tylko w języku Python, co sprawia, że może lepiej nadaje się niżsubprocess
.multiprocessing
jest wieloplatformowy, więc powinno działać dobrze w systemie Windows lub Mac z niewielką lub żadną regulacją. Nie ma potrzeby sprawdzania systemu operacyjnego. Zostało to przetestowane na systemie Linux, Ubuntu 18.04LTS.Uruchomienie
file.py
powoduje wyświetlenie okna figury, a następnie__main__
wyjście, ale okno figurymultiprocessing
+matplotlib
pozostaje responsywne dzięki przyciskom powiększania, przesuwania i innym przyciskom, ponieważ jest to niezależny proces.Sprawdź procesy w wierszu polecenia bash za pomocą:
ps ax|grep -v grep |grep file.py
źródło
.daemon=False
zgodnie z opisem tutaj stackoverflow.com/a/49607287/1476932 Jednaksys.exit()
nie zakończyłem procesu nadrzędnego zgodnie z opisem, dopóki nie zamknąłem okna potomnego. Z drugiej strony korzystanieos._exit(0)
z powyższego przykładu działało.Moim zdaniem odpowiedzi w tym wątku dostarczają metody, które nie działają dla każdego systemu oraz w bardziej złożonych sytuacjach, takich jak animacje. Proponuję rzucić okiem na odpowiedź MiKTeX w następującym wątku, w którym znaleziono niezawodną metodę: Jak czekać, aż animacja matplotlib się skończy?
źródło
Jeśli chcesz otworzyć wiele cyfr, zachowując je wszystkie, ten kod działał dla mnie:
źródło
Chociaż nie odpowiadam bezpośrednio na prośbę PO, publikuję to obejście, ponieważ może pomóc komuś w takiej sytuacji:
do tego używam:
Gdzie „var” identyfikuje wykres w pętli, więc nie zostanie on nadpisany.
źródło
Użyj
plt.show(block=False)
i na końcu wywołania skryptuplt.show()
.Zapewni to, że okno nie zostanie zamknięte po zakończeniu skryptu.
źródło