我有这种类型的数据集:
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}
干杯