Beschleunigen Sie ListLinePlot

8

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 :

zu verwenden %Vor%

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:

  • MATLAB zeigt die gleiche Datenmenge fast sofort auf demselben Computer an, daher sollte die Größe der Rohdaten kein Problem sein.
  • Ich habe bereits versucht, Graphics Antialiasing zu deaktivieren, aber es hat die Rendering-Geschwindigkeit überhaupt nicht beeinflusst.
  • Die Verwendung von DataRange zur Vermeidung von Take hilft nicht.
  • Die Verwendung von MaxPlotPoints verzerrt das Diagramm zu sehr, um nützlich zu sein.
  • Die Verwendung von Take in Manipulate hilft nicht.
  • Das Rendering benötigt sehr viel Zeit. Running 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.
  • Ich verwende Mathematica unter Ubuntu Linux 11.10 mit den fglrx-Treibern. Es war nicht hilfreich, Mathematica zu zwingen, Mesa-Treiber zu verwenden.

Irgendein Hinweis?

    
Giuseppe Cardone 02.07.2011, 23:11
quelle

4 Antworten

7

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%
  1. In 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.
  2. Versuchen Sie es mit der Option ContinuousAction->False (siehe Dokumentation ) (ich sehe @Szabolcs hatte das gleiche) Idee, als ich tippte.
  3. Ich wollte gerade MaxPlotPoints vorschlagen, aber probiere stattdessen die Option PerformanceGoal ->"Speed" . (Siehe Dokumentation )
Verbeia 02.07.2011, 23:33
quelle
11

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: Ссылка

    
Thomas 07.07.2011 23:04
quelle
5

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:

  1. 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?)

  2. Verwenden Sie ContinuousAction -> False in Manipulate , um zu verhindern, dass alles in Echtzeit neu berechnet wird, während Sie die Schieberegler ziehen.

Szabolcs 02.07.2011 23:30
quelle
5

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.

    
Szabolcs 26.07.2011 15:16
quelle

Tags und Links