使用 PGFPlots 和 GNUPlot 绘制时间序列

使用 PGFPlots 和 GNUPlot 绘制时间序列

我正在尝试使用 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 中。

相关内容