pgfplot:绘制大型数据集

pgfplot:绘制大型数据集

我尝试使用 绘制一个很大的数据集pgfplots。由于我知道大文件存在问题,因此我使用了外部模式。我另外将 增加到main_memory30000006000000它还是崩溃了,说pdflatex超出了主内存。但如果我在编译期间查看系统的内存消耗,我看不到内存使用量有任何增加。我找不到任何解释main_memory需要什么,是字节还是千字节?如果我将其增加到更大的值,fmtutil-sys --all将会失败并且pdflatex不再起作用。我能以某种方式解决这个问题吗?

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\usepgfplotslibrary{external} 
\tikzexternalize

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot table[x expr=\coordindex, y index=0] {largefile};
  \end{axis}
\end{tikzpicture}

\end{document}

我也尝试用 进行编译lualatex(只是pdflatex用替换lualatex),但这似乎也调用了pdflatex?至少我收到了这个错误信息(lualatex和 也是一样pdflatex):

! Package tikz Error: Sorry, the system call 'pdflatex -halt-on-error -interact
ion=batchmode -jobname "report-figure0" "\def\tikzexternalrealjob{report}\input
{report}"' did NOT result in a usable output file 'report-figure0' (expected on
e of .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled system calls. 
For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also named 'wri
te 18' or something like that. Or maybe the command simply failed? Error messag
es can be found in 'report-figure0.log'. If you continue now, I'll try to types
et the picture.

摘录自report-figure0.log

! TeX capacity exceeded, sorry [main memory size=6000000].
\pgfplotsapplistXXpushback@smallbufoverfl ...toka 
                                                  \the \t@pgfplots@tokb \the...
l.13 ... expr=\coordindex, y index=0] {largefile};
                                                  ^^M 

largefile大小为 5.7 Mb,有 593932 个数据点。我几乎不敢说我还有一个大小为 163 Mb 的文件,有 18928305 个数据点。我认为这没问题,因为 gnuplot 可以快速处理这些文件,没有任何问题。

的头largefile

9409252
17298051
21351017
24466010
26952485
29389696
31442872
33345635
35029538
36710432

请查找数据集这里

我正在使用 texlive2012:

$ pdflatex
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
 restricted \write18 enabled

$ lualatex
This is LuaTeX, Version beta-0.70.2-2012052410 (TeX Live 2012)
 restricted \write18 enabled.

答案1

这是一个非常密集采样的数据集!正如 Paul Gaborit 在评论中指出的那样,您需要首先对其进行下采样,尤其是当数据如此平滑时。绘制每个数据点将使文件大小膨胀并降低渲染性能,而不会为绘图增加任何价值。

您可以gnuplot在 PGFPlots 中使用 来对数据进行下采样。如果您只绘制每 1000 个点,则绘图与完整数据没有区别,但您可以坚持pdflatex使用 而不必使用lualatex

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\usepgfplotslibrary{external} 
\tikzexternalize
\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot [no markers] gnuplot [raw gnuplot] {
        plot "largefile.csv" using ($0*1000):1 every 1000; % $0 is the dummy column for the coordinate index
    };
  \end{axis}
\end{tikzpicture}

\end{document}

如果需要非均匀采样,只需连接几个plot命令即可:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\usepgfplotslibrary{external} 
\tikzexternalize
\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \addplot [no markers] gnuplot [raw gnuplot] {
        plot "largefile.csv" using ($0):1 every 1::1::300;
        plot "largefile.csv" using ($0*100+300):1 every 100::300::6000;
        plot "largefile.csv" using ($0*1000+6000):1 every 1000::6000
    };
  \end{axis}
\end{tikzpicture}

\end{document}

答案2

您可以使用这个简单的 sed 单行程序来减少数据,例如每 200 个值

sed -n '1~200p' < large.data > large200.data

那么就可以轻松地绘制它。

前 200 个,然后每 1000 个的替代方案是:

sed '1,200!d' < large.data > large1000.data     
sed -n '201~1000p' < large.data >> large1000.data

相关内容