使用 PGFplots 編譯僅處理每個 x 個資料點的文件?

使用 PGFplots 編譯僅處理每個 x 個資料點的文件?

可能的重複:
使用 pgfplot 繪圖時如何從文件中選擇有限數量的樣本

編譯包含許多 PGF 圖的文檔(每個圖包含 CSV 檔案中的數千個資料點)需要很長時間(分鐘)。我意識到擁有這麼多數據點是沒有意義的——如果有,比如說,十分之一,就足以在紙上重新創建相同的圖。

例如,我的一個檔案包含 216000 行這樣的格式:
0.000000000000000000e+00 0.000000000000000000e+00 1.388888888888888888e-04 -2.182787284255027771e-11
當然,這太多了。然後我將該文件讀取為:

\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}

該套件是否可以只採用每 x 行來加速編譯過程?或者有其他方法可以使其(顯著)更快嗎?

我正在運行 Ubuntu,我的一個朋友建議我編寫一個awk腳本來遍歷一個.csv檔案並只保留每 x 行。但是,我不知道如何做到這一點,因為我awk以前從未使用過。如果這最終成為選擇,有人可以幫我設定這樣的腳本嗎?

答案1

pgfplots 提供了過濾器each nth point=100

由於坐標過濾有不同的用例,您可能需要設定

each nth point=100, filter discard warning=false, unbounded coords=discard 

此組合不會為每個丟棄的點產生警告。此外,它會默默地刪除 99 個點 - 就像您根本沒有將它們寫入輸入流一樣。請注意,替代選擇unbounded coords=jump將明確中斷您的情節(這不是您想要的)。

據報告,這種方法工作得相當好:事實上,時間並沒有長多少,就好像使用一些外部工具來過濾資料檔案一樣(最近一些高級用戶在每封郵件中報告過)。

答案2

儘管pgfplots過濾器each nth point在某種程度上可能是一種解決方案,但它肯定不是可以普遍使用的解決方案。例如,選擇each nth point=100可能會扭曲繪圖中真正需要額外點才能正確說明的某些區域。另一方面,each nth point就使用的點數而言,設定較低的數字可能並不「經濟」。

簡而言之,需要更聰明的下採樣方法。此方法應該能夠根據每個區域繪圖的複雜性動態調整保留的點數,以便我們僅使用所需的最少點數即可獲得最佳的視覺結果(類似於乳膠能夠自動調整each nth point=?在圖表的「通過」過程中多次)。

看一眼這個答案

如果您有 matlab 或 Octave,您可以使用matlab2tikz那裡提供的修改版本,它實現了高效的下採樣演算法。

另一方面,如果您既不使用matlab 也不使用Octave,您仍然可以將該下取樣演算法(位於函數pointReduction 中)翻譯為您想要的語言,並使用它對數字進行下取樣,然後將其匯出到CSV。

相關內容