Pgfplots:从不同的列中组合日期

Pgfplots:从不同的列中组合日期

我正在尝试在 pgfplots 中绘制时间序列的数据文件。日期不是YYYY-MM-DD hh:mmPGF 日历库所要求的格式(请参阅pgfplots 手册),但在不同的列中称为year、等monthday

有没有一种方法可以在调用时动态地将不同的列合并为所需格式的新字符串\addplot table(可能使用类似的东西x expr=...)?我试图避免使用\pgfplotstableread命令,create on use因为我发现运行时间出奇地长。

下面是我所讨论的数据文件格式的一个示例:

year, month, day, hour, minute, value  
2006, 5, 21, 1, 0, 10.5  
2006, 5, 22, 2, 0, 23.4  
2006, 5, 22, 4, 5, 30.1  
2006, 5, 27, 3, 0, 35.2

答案1

我知道这个问题现在已经很老了......但如果仍然对答案感兴趣:这里有一个可以“即时”工作的答案:


\documentclass{minimal}
\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}
\pgfplotsset{compat=newest}
\begin{document}

\pgfplotsset{
    custom date format/.code={
        % set the normal data format:
        \pgfkeysalso{date coordinates in=x}%
        % query the 'x coord trafo' key's value:
        \pgfkeysgetvalue{/pgfplots/x coord trafo/.@cmd}\temp
        % store it (globally):
        \global\let\theolddatacoordtrafo=\temp
        % redefine it:
        \pgfkeysdef{/pgfplots/x coord trafo}{%
            % evaluate the expression:
            \edef\temp{#1}%
            \message{Coordinate \coordindex: Using \temp.^^J}%
            % now, insert the *value* of '\temp' as argument to
            % the original 'x coord trafo':
            \expandafter\theolddatacoordtrafo\temp\pgfeov
        }%
    },
}
\begin{tikzpicture}
\begin{axis}[
    custom date format={\thisrow{year}-\thisrow{month}-\thisrow{day} \thisrow{hour}:\thisrow{minute}}, 
    % pretty-printing:
    width=\linewidth,
    xticklabel style={rotate=90,anchor=near xticklabel},
    xticklabel=\day. \hour:\minute,
]
\addplot table[col sep=comma,y=value] {

year, month, day, hour, minute, value 2006, 5, 21, 1, 0, 10.5 2006, 5, 22, 2, 0, 23.4 2006, 5, 22, 4, 5, 30.1 2006, 5, 27, 3, 0, 35.2 }; \end{axis} \end{tikzpicture} \end{document}

我的想法是定义一个自定义的“x coord trafo”,它以“正确”的方式连接您的列,然后将连接和扩展('\edef'=扩展定义)的结果传递给 dateplot lib 使用的“x coord trafo”。

因此,数据图库不知道预处理步骤,并且预处理步骤是即时执行的。

实际上,pgfplots 中缺少从表格中组装符号坐标的功能。我已在待办事项列表中做了记录,以便未来版本(最终)将支持类似“x 符号表达式 = {\thisrow{year}-\thisrow{month}...}”的功能。

答案2

我不认为在不使用命令的情况下使用 pgfplots 可以做到这一点create on use,因为这正是命令的用途。您的速度问题可能与时间有关:使用 一次性导入数据\pgfplotstableread,然后使用pgfplotstableset创建自定义列,或者使用 命令read completely在任何后期或预处理之前将整个文件放入内存中可能会更快。

答案3

我建议对输入文件进行预处理。对于 Linux,在终端上执行以下命令

awk --field-separator="," '{printf "%d-%d-%d %d:%d %e\n",$1,$2,$3,$4,$5,$6}' 输入文件 > 输出文件

生成格式为

2006-5-21 1:0 1.050000e+01
2006-5-22 2:0 2.340000e+01
2006-5-22 4:5 3.010000e+01
2006-5-27 3:0 3.520000e+01

等等,这些应该可以pgfplots在合理的时间内与包装一起使用。

答案4

在 Latex 中执行此操作可能很复杂,如果我是你,我会预处理数据。Excel(使用连接函数)或 R(使用粘贴函数)等工具很有用,你可以在两分钟内完成。

除非绝对有必要直接在 Latex 中执行此操作......

相关内容