我想从大量是文本文件中的数据。
为了最小化文件大小,并且是值位于一个规则的矩形网格上,X和是坐标不存储在文件中,但应在读取时即时计算是文件中的数据。
考虑以下最小示例排队数据(取自pgfplots
手册):
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.12}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={0}{90}]
\addplot3[surf,mesh/rows=3] coordinates {
(0,0,0) (1,0,0) (2,0,0) (3,0,0) (0,1,0) (1,1,0.6) (2,1,0.7) (3,1,0.5) (0,2,0) (1,2,0.7) (2,2,0.8) (3,2,0.5)
};
\end{axis}
\end{tikzpicture}
\end{document}
我该如何修改这个例子,让它能够从外部的数据文件格式如下(全部是单个输入行上的值;后面还有更多输入行,每行代表另一个时间步长):
% input.dat
0 0 0 0 0 0.6 0.7 0.5 0 0.7 0.8 0.5
这是否可以开箱即用,还是我必须通过外部程序或脚本预处理数据?
答案1
这不是进行必要预处理的唯一方法。您还可以使用xstring
或pgfplotstable
。
\parse
注意:后面的空白#1
很重要。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.12}
\newcommand{\somelist}{}% reserve global name
\begin{document}
\bgroup% use local names and registers
\countdef\row=1
\countdef\column=2
% copy file to \data
\newread\fid
\openin\fid=test.dat % contains only 0 0 0 0 0 0.6 0.7 0.5 0 0.7 0.8 0.5
\read\fid to\data% reads one line from file
\closein\fid
% recursive macro, #1 = text to next blank (each interation)
\def\parse#1 {\xdef\somelist{\somelist(\the\row,\the\column,#1)}
\advance\row by 1
\ifnum\row>3\relax
\row=0
\advance\column by 1
\fi
\ifnum\column>2\else\expandafter\parse\fi}
% format data to \somelist
\xdef\somelist{}
\row=0
\column=0
\expandafter\parse\data
\egroup
\begin{tikzpicture}
\begin{axis}[view={0}{90}]
\addplot3[surf,mesh/rows=3] coordinates{\somelist};
\end{axis}
\end{tikzpicture}
\end{document}
如果您有注释行,您将需要手动阅读/跳过它们。