我正在尝试使用 PGFPlots 绘制大型时间序列,但它需要很长时间并且经常因内存错误而崩溃,所以我想到使用 GNUPlot。这在相同的数据上工作正常,但使用简单的连续 x 坐标,但使用日期时间时 PGFPlots 无法解析 GNUPlot 的输出。
这是一个 MWE:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\usepgfplotslibrary{dateplot}
\begin{filecontents}{values.csv}
datetime,value
2016-01-01 00:00:00,1
2016-01-02 00:00:00,6
2016-01-05 00:00:00,3
2016-01-08 00:02:00,6
2016-01-13 00:00:00,9
2016-01-25 03:05:00,3
2016-02-05 03:04:00,7
2016-05-31 00:00:00,9
2016-12-01 12:04:00,4
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
date coordinates in=x,
date ZERO=2016-01-01,
]
\addplot gnuplot [id=my_datetime_plot, raw gnuplot] {
set xdata time;
set timefmt "\%Y-\%m-\%d \%H:\%M:\%S";
set format x "\%Y-\%m-\%d \%H:\%M:\%S";
set datafile separator ",";
plot "values.csv" using 1:2 w lines;
};
\end{axis}
\end{tikzpicture}
\end{document}
在我运行 latex 之后,该文件paper.my_datetime.table
被 GNUPlot 正确填充:
# Curve 0 of 1, 9 points
# Curve title: ""values.csv" using 1:2"
# x y type
"2016-01-01 00:00:00" 1.0000000e+00 i
"2016-01-02 00:00:00" 6.0000000e+00 i
"2016-01-05 00:00:00" 3.0000000e+00 i
"2016-01-08 00:02:00" 6.0000000e+00 i
"2016-01-13 00:00:00" 9.0000000e+00 i
"2016-01-25 03:05:00" 3.0000000e+00 i
"2016-02-05 03:04:00" 7.0000000e+00 i
"2016-05-31 00:00:00" 9.0000000e+00 i
"2016-12-01 12:04:00" 4.0000000e+00 i
但是,现在 PGFPlots 似乎无法解析日期:
! Package PGF Math Error: Could not parse input '00:00:00"' as a floating point
number, sorry. The unreadable part was near ':00:00"'..
我想它认为
"2016-01-01 00:00:00" 1.0000000e+00 i
作为四个不同的字段,忽略引号。
我认为一个快速解决方法是告诉 GNUPlot 导出不带空格的日期时间,例如
set format x "\%Y-\%m-\%dT\%H:\%M:\%S";
但现在 PGFPlots 无法解析它们。据我所知,PGFPlots 日期时间格式被硬编码为
%Y-%m-%d %H:%M:%S
我遗漏了什么吗?如何指定日期时间格式?
我看见这个未解问题就我而言,我可以让 GNUPlot 输出正确的值,问题似乎出在 PGFPlots 中。