Ich versuche mit Mathematica einige Rohdaten zu analysieren. Ich möchte in der Lage sein, den Datenbereich, an dem ich interessiert bin, dynamisch mit Manipulate
und ListLinePlot
anzuzeigen, aber das Plot-Rendering ist extrem langsam. Wie kann ich es beschleunigen?
Hier sind einige zusätzliche Details. Eine externe Textdatei speichert die Rohdaten: Die erste Spalte ist ein Zeitstempel, die zweite, dritte und vierte Spalte sind Datenwerte, zum Beispiel:
%Vor%Eine einzelne Datei enthält bis zu 2 · 10 6 Zeilen. Um zum Beispiel die zweite Spalte anzuzeigen, verwende ich:
%Vor% Die Ausführungszeit dieser Operation ist unerträglich lang. Um einen variablen Bereich von Daten anzuzeigen, habe ich versucht, Manipulate
:
Diese Anweisung funktioniert, aber sie kriecht schnell, wenn ich versuche, mehr als ein paar tausend Zeilen anzuzeigen. Wie kann ich es beschleunigen?
Einige zusätzliche Details:
DataRange
zur Vermeidung von Take
hilft nicht. MaxPlotPoints
verzerrt das Diagramm zu sehr, um nützlich zu sein. Take
in Manipulate
hilft nicht. Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]
gibt 0.33
zurück: Dies bedeutet, dass die Auswertung von Take
selbst fast augenblicklich ist, ist das Plot-Rendering, das alles verlangsamt. Irgendein Hinweis?
Ich habe das nicht ausführlich auf meinem Rechner getestet (ich habe einen Mac, daher kann ich Linux-spezifische Probleme nicht ausschließen). aber ein paar Punkte kommen mir vor. Das Folgende war ziemlich schnell für mich, aber offensichtlich langsamer, als wenn der Datensatz kleiner wäre. Sie planen Hunderttausende Datenpunkte.
%Vor%Manipulate
lässt sich die Menge der mit Take
angezeigten Daten beliebig variieren. Versuchen Sie nur, numrows
alle 100 Punkte zu erhöhen, damit weniger gerendert wird. ContinuousAction->False
(siehe Dokumentation ) (ich sehe @Szabolcs hatte das gleiche) Idee, als ich tippte. MaxPlotPoints
vorschlagen, aber probiere stattdessen die Option PerformanceGoal ->"Speed"
. (Siehe Dokumentation ) Wenn es Ihr Ziel ist, Ihre Daten schnell und einfach zu visualisieren, können Sie den folgenden Trick verwenden, den ich ständig verwende.
Ich teile die Daten in eine Anzahl von Blöcken auf, die ungefähr der Auflösung meines Bildschirms entsprechen (normalerweise 1000 oder weniger), mehr Details können sowieso nicht angezeigt werden. Dann bestimme ich die Min und Max jedes Blocks und zeichne eine Zick-Zack-Linie von Min bis Max bis Min bis Max ... Das Ergebnis wird genau wie die Originaldaten aussehen. Sie können jedoch nicht "hineinzoomen", wie Sie dann die Zick-Zack-Linie sehen würden (z. B. beim Export in eine hochauflösende PDF-Datei). Dann müssen Sie eine größere Anzahl von Blöcken verwenden.
%Vor% Sie können die Option DataRange->{...}
hinzufügen, um die X-Achse entsprechend zu beschriften.
Hoffe, das hilft!
BEARBEITEN: Siehe auch diese ähnliche Frage zu Mathematica Stackexchange: Ссылка
Ich habe auch bemerkt, dass Mathematica gelegentlich zu lange braucht, um Grafiken zu rendern. Eigentlich muss es ein Übersetzungsschritt von einem Mathematica Graphics
-Ausdruck zu einer anderen Repräsentation sein, die lange dauert, da die Größe (und somit das erneute Rendern) der Grafik nach dem Rendern viel schneller ist. Pre-Version-6 Grafik-Rendering war früher für viele Beispiele schneller (aber es fehlt auch an Funktionalität, die 6+ hat).
Einige Ideen, was Sie tun könnten:
Verwenden Sie die Option MaxPlotPoints
von ListLinePlot
, um die Daten vor dem Plotten zu reduzieren. Es macht vielleicht keinen Unterschied, ob es verkleinert wird. Die Method
-Option sollte den Downsample-Algorithmus wählen, aber ich kann keine Dokumente dafür finden (irgendjemand?)
Verwenden Sie ContinuousAction -> False
in Manipulate
, um zu verhindern, dass alles in Echtzeit neu berechnet wird, während Sie die Schieberegler ziehen.
Eine andere Idee ist hier der Ramer-Douglas-Peucker-Algorithmus um die Anzahl der Datenpunkte vor dem Plotten zu reduzieren. Dies wird wahrscheinlich die Form der Daten besser erhalten. Ich weiß nicht, ob Sie das noch brauchen, also werde ich keine Implementierung bereitstellen.
Tags und Links wolfram-mathematica plot