Mögliches Duplikat:
So wählen Sie beim Plotten mit pgfplot eine endliche Anzahl von Samples aus der Datei aus
Das Zusammenstellen meines Dokuments mit vielen PGF-Plots, von denen jeder Tausende von Datenpunkten aus einer CSV-Datei enthält, dauert zu lange (Minuten). Mir ist klar, dass es keinen Sinn macht, so viele Datenpunkte zu haben – wären es beispielsweise ein Zehntel, würde das ausreichen, um denselben Plot auf Papier nachzubilden.
Eine meiner Dateien besteht beispielsweise aus 216000 Zeilen in einem solchen Format:
0.000000000000000000e+00 0.000000000000000000e+00 1.388888888888888888e-04 -2.182787284255027771e-11
Das ist natürlich viel zu viel. Ich lese die Datei dann so:
\documentclass{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
\addplot[mark=*, color=red] file {Data/plotXYZ.dat};
\end{loglogaxis}
\end{tikzpicture}
\end{document}
Ist es möglich, dass das Paket nur jede x-te Zeile übernimmt, um den Kompilierungsprozess zu beschleunigen? Oder gibt es andere Möglichkeiten, es (deutlich) schneller zu machen?
Ich verwende Ubuntu und ein Freund hat mir empfohlen, ein awk
Skript zu schreiben, das eine Datei durchsucht .csv
und nur jede x-te Zeile speichert. Ich habe jedoch keine Ahnung, wie ich das machen soll, da ich es noch nie awk
zuvor verwendet habe. Wenn sich dies als die Option der Wahl herausstellen sollte, könnte mir jemand beim Einrichten eines solchen Skripts helfen?
Antwort1
pgfplots bietet den Filter an each nth point=100
.
Da die Koordinatenfilterung verschiedene Anwendungsfälle hat, möchten Sie möglicherweise Folgendes festlegen:
each nth point=100, filter discard warning=false, unbounded coords=discard
Diese Kombination erzeugt keine Warnungen für jeden verworfenen Punkt. Darüber hinaus werden die 99 Punkte stillschweigend gelöscht – so, als ob Sie sie überhaupt nicht in den Eingabestrom geschrieben hätten. Beachten Sie, dass die alternative Auswahl unbounded coords=jump
Ihren Plot explizit unterbrechen würde (was Sie hier nicht wollen).
Dieser Ansatz funktioniert Berichten zufolge recht gut: Tatsächlich war der Zeitaufwand nicht viel größer, als wenn zum Filtern der Datendatei ein externes Tool verwendet worden wäre (wie ein Poweruser kürzlich per E-Mail berichtete).
Antwort2
Obwohl der pgfplots
Filter each nth point
bis zu einem gewissen Grad eine Lösung sein könnte, ist er sicherlich keine, die allgemein verwendet werden kann. Beispielsweise each nth point=100
könnte die Auswahl von einige Bereiche des Diagramms verzerren, die die zusätzlichen Punkte wirklich benötigen, um richtig dargestellt zu werden. Andererseits each nth point
könnte die Einstellung auf eine niedrigere Zahl im Hinblick auf die Anzahl der verwendeten Punkte nicht „wirtschaftlich“ sein.
Zusamenfassend,Es ist eine intelligentere Downsampling-Methode erforderlich. Diese Methode sollte in der Lage sein, die Anzahl der beibehaltenen Punkte dynamisch anzupassen, abhängig von der Komplexität des Diagramms in jedem Bereich, sodass wir das beste visuelle Ergebnis erzielen, indem wir nur die minimal erforderliche Anzahl von Punkten verwenden (so ähnlich wie Latex, das in der Lage ist, each nth point=?
während des „Durchlaufs“ eines Diagramms mehrere automatische Anpassungen vorzunehmen).
Schauen Sie sich andiese Antwort.
Falls Sie Matlab oder Octave haben, können Sie die matlab2tikz
dort bereitgestellte modifizierte Version verwenden, die einen effizienten Downsampling-Algorithmus implementiert.
Wenn Sie andererseits weder Matlab noch Octave verwenden, können Sie diesen Downsampling-Algorithmus (er befindet sich in der Funktion „PointReduction“) trotzdem in die gewünschte Sprache übersetzen und ihn zum Downsampling Ihrer Zahlen verwenden und diese dann in CSV exportieren.