pgfplots 数据时间格式

pgfplots 数据时间格式

我有这种类型的数据集:

Time          State
22:54:14.716    5
22:54:14.716    5
22:54:14.716    5
22:54:14.716    5
22:54:14.729    4
22:54:14.919    1
22:54:14.919    1
22:54:15.128    5

我想绘制一个图表pgfplots但是该程序包无法正确读取时间格式。

答案1

您必须告诉 PGFPlots 如何处理这些时间,这可以使用键来完成。我定义了一种处理该问题的x coord trafo/.code新样式。timeplot

请注意,由于您使用的是数字上不利的数据格式(您需要处理 8 位有效数字),因此您应该通过定义接近实际数据范围的零点来将数据置于中心(在您的示例中,您可以减去 22 小时)。我已timeplot zero为此定义了一个采用小时值的键。

\documentclass[tikz,border=2mm]{article}
\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}

\def\transformtime#1:#2:#3!{
    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
    \pgfmathparse{#1*3600-\pgfkeysvalueof{/pgfplots/timeplot zero}*3600+#2*60+#3}
    \pgfkeys{/pgf/fpu=false}
}

\pgfplotsset{
    timeplot zero/.initial=0,
    timeplot/.style={
        x coord trafo/.code={\expandafter\transformtime##1!},
        x coord inv trafo/.code={%
            \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
            \pgfmathsetmacro\hours{floor(##1/3600)+\pgfkeysvalueof{/pgfplots/timeplot zero}}
            \pgfmathsetmacro\minutes{floor((##1-(\hours-\pgfkeysvalueof{/pgfplots/timeplot zero})*3600)/60)}
            \pgfmathsetmacro\seconds{##1-floor(##1/60)*60}
            \def\pgfmathresult{\pgfmathprintnumber{\hours}:\pgfmathprintnumber{\minutes}:\pgfmathprintnumber[fixed zerofill]{\seconds}}
            \pgfkeys{/pgf/fpu=false}
        },
    scaled x ticks=false,
    xticklabel=\tick
    }
}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    timeplot, timeplot zero=22,
    xtick={22:54:14.75,22:54:15}]
\addplot table {
Time          State
22:54:14.716    5
22:54:14.716    5
22:54:14.716    5
22:54:14.716    5
22:54:14.729    4
22:54:14.919    1
22:54:14.919    1
22:54:15.128    5
};
\end{axis}
\end{tikzpicture}
\end{document}

答案2

谢谢您的回答,我做了一些额外的修改,特别是为了防止 08 问题。

删除前导零:

\def\removeleadingzeros#1{\if0#1 \expandafter\else#1\fi}

新的定义:(主要是在 x 标签前添加 0,并且秒数没有浮点)

\def\transformtime#1:#2:#3!{
\pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
%\pgfmathparse{#1*3600-\pgfkeysvalueof{/pgfplots/timeplot zero}*3600+#2*60+#3}
\pgfmathparse{\removeleadingzeros#1*3600-\pgfkeysvalueof{/pgfplots/timeplot zero}*3600+\removeleadingzeros#2*60+\removeleadingzeros#3}
\pgfkeys{/pgf/fpu=false}
}


\pgfplotsset{
timeplot zero/.initial=0,
timeplot/.style={
    x coord trafo/.code={\expandafter\transformtime##1!},
    x coord inv trafo/.code={%
        \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
        \pgfmathsetmacro\hours{floor(##1/3600)+\pgfkeysvalueof{/pgfplots/timeplot zero}}
        \pgfmathsetmacro\minutes{floor((##1-(\hours-\pgfkeysvalueof{/pgfplots/timeplot zero})*3600)/60)}
        \pgfmathsetmacro\seconds{##1-floor(##1/60)*60}
        \def\pgfmathresult{\pgfmathparse{mod(\hours,60)<10?"0":{},int(mod(\hours,60))}\pgfmathresult:\pgfmathparse{mod(\minutes,60)<10?"0":{},int(mod(\minutes,60))}\pgfmathresult:\pgfmathparse{mod(\seconds,60)<10?"0":{},int(mod(\seconds,60))}\pgfmathresult}
        \pgfkeys{/pgf/fpu=false}
    },
scaled x ticks=false,
xticklabel=\tick
}
}

此外,我还删除了不需要的秒数的浮点数。但应该很容易添加。

例子:

\begin{tikzpicture}
\begin{axis}[
    timeplot, timeplot zero=0,
    xtick={02:08:08,11:30:15}]
\addplot table {
Time          State
02:08:00    1
03:54:02    2
04:54:03    3
05:54:04    4
06:54:05    5
07:54:06    6
08:54:07    5
09:54:08    4
10:54:09    3
11:54:10    2
12:54:11    1
};
\end{axis}
\end{tikzpicture}

干杯

相关内容