使 pgfplots 解析时间(或其他)

使 pgfplots 解析时间(或其他)

对于那些在所有这些扩展问题方面有一定经验的人来说,这很可能是微不足道的,但我有一个关于 pgfplots 的简单问题。我想稍微修改一下它的解析行为。(是的,我知道这个dateplot库,但我没有成功地根据我的需要调整那里的技巧。)这个问题的动机是这个问题。我只是想将一些数据(特别是这里的时间)转换为数字。这是我的尝试。

\documentclass[11pt, twoside, a4paper]{report}
\usepackage{pgfplots}
%\usepgfplotslibrary{dateplot}
\pgfplotsset{compat=1.16}
\usepackage{filecontents}
\begin{filecontents*}{somedata.csv}
Time;AC
00:00:00;-0.4442
00:01:00;-0.4445
\end{filecontents*}
\makeatletter 
\def\myparse#1:#2:#3 #4{%
        \pgf@xa=#1pt
        \pgf@xb=#2pt
        \divide\pgf@xb by60
        \advance\pgf@xa by\pgf@xb
        \pgf@xb=#3pt
        \divide\pgf@xb by3600
        \advance\pgf@xa by\pgf@xb
        \ifdim\pgf@xa<0pt
                \pgf@xa=0pt
        \fi
        \edef#4{\pgf@sys@tonumber\pgf@xa}%
}% 
\newcommand\TimeParse[1]{\myparse#1 \tmp%
\tmp
}
\makeatother

\begin{document}
\TimeParse{00:01:00}
        \begin{tikzpicture}
        \begin{axis}
        %\addplot table [x expr=\TimeParse{\thisrow{Time}}, y=AC, col sep=semicolon] {somedata.csv};
        \end{axis}
        \end{tikzpicture}
\end{document}

不出所料,\TimeParse{00:01:00}返回一个数字。但是,一旦我尝试用 将其添加到坐标前面x expr=\TimeParse{\thisrow{Time}},这个“解析器”就会失败并出现错误! Argument of \myparse has an extra }.,我无法修复它。(如果这个问题的答案可以包含一些解释,那就太好了……这可能使解析更一般类型的数据成为可能。;-)

答案1

嗯,首先,\thisrow{Time}您的 \myparse 命令的格式不正确。您似乎希望它在插入 \TimeParse 命令的定义主体之前会神奇地扩展。

其次,创建一个可扩展的命令可能是一个好主意。这意味着定义中没有 \edef 和赋值。这似乎有效:

\documentclass[11pt, twoside, a4paper]{report}
\usepackage{pgfplots}
%\usepgfplotslibrary{dateplot}
\pgfplotsset{compat=1.16}
\usepackage{filecontents}
\begin{filecontents*}{somedata.csv}
Time;AC
00:00:00;-0.4442
00:01:00;-0.4445
\end{filecontents*}
\usepackage{xfp}
%no idea how to define a command with : in the delimited argument in expl3 ...
\def\marmottimeparseaux#1:#2:#3xxx{\fpeval{#2 / 60 + #1 +(#3/3600)}}
\ExplSyntaxOn
\cs_new:Nn \marmot_timeparse:n { \marmottimeparseaux #1xxx }
\newcommand\TimeParse[1]{\exp_args:Nf\marmot_timeparse:n {#1}}
\ExplSyntaxOff

\begin{document}


        \begin{tikzpicture}
        \begin{axis}
        \addplot table [x expr=\TimeParse{\thisrow{Time}}, y=AC, col sep=semicolon] {somedata.csv};
        \end{axis}
        \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容