Matplotlib wolno z dużymi zestawami danych, jak włączyć decymację?

Używam matplotlib do aplikacji do przetwarzania sygnałów i zauważyłem, że dławi duże zestawy danych. To jest coś, co naprawdę muszę poprawić, aby była użyteczną aplikacją.

To, czego szukam, to sposób, aby pozwolić matplotlibowi zdziesiątkować moje dane. Czy istnieje ustawienie, właściwość lub inny prosty sposób, aby to umożliwić? Wszelkie sugestie, jak to zrealizować, są mile widziane.

Niektóre kody:
import numpy as np
import matplotlib.pyplot as plt

n=100000 # more then 100000 points makes it unusable slow
plt.plot(np.random.random_sample(n))
plt.show()
Niektóre podstawowe informacje

Pracowałem nad dużą aplikacją C ++, gdzie potrzebowaliśmy wykreślić duże zbiory danych i rozwiązać ten problem, wykorzystując następującą strukturę danych:

W większości przypadków, jeśli chcemy wykres liniowy, dane są uporządkowane, a często nawet równomierne. Jeśli jest równomierny, możesz obliczyć indeks początkowy i końcowy w tablicy danych bezpośrednio z prostokąta powiększenia i transformacji osi odwrotnej. Jeśli jest uporządkowany, ale nie jest równomierny, można użyć wyszukiwania binarnego.

Następnie powiększony wycinek jest dziesiątkowany, a ponieważ dane są uporządkowane, możemy po prostu iterować blok punktów, które mieszczą się w jednym pikselu. Dla każdego bloku obliczana jest średnia, maksymalna i minimalna. Zamiast jednego piksela rysujemy następnie pasek na wykresie.

Na przykład: jeśli oś x jest uporządkowana, dla każdego bloku zostanie narysowana pionowa linia, być może średnia z innym kolorem.

Aby uniknąć aliasingu, wykres jest przepełniony współczynnikiem dwa.

W przypadku wykresu rozproszonego dane można uporządkować, sortując, ponieważ kolejność wydruku nie jest ważna.

Fajną cechą tego prostego przepisu jest to, że im bardziej przybliżasz, tym szybciej się on staje. Z mojego doświadczenia wynika, że ​​tak długo, jak dane mieszczą się w pamięci, wątki pozostają bardzo responsywne. Na przykład 20 wątków danych z historii czasu z 10 milionami punktów nie powinno stanowić problemu.

questionAnswers(2)

yourAnswerToTheQuestion