使用 pgfplots 和 dateplots 绘制趋势线

使用 pgfplots 和 dateplots 绘制趋势线

有没有一种简单的方法可以避免在编译时出现以下非常简单的错误消息:Could not parse input '2010-01-01' as a floating point number, sorry. The unreadable part was near '-01-01' 尝试编译时:

\documentclass{minimal}
\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}
\begin{filecontents}{data.dat}
date            value1
2010-01-01      2
2010-01-02      10
2010-01-03      8
2010-01-04      15
\end{filecontents}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}

\begin{axis}[
date coordinates in=x,
xticklabel={\day.\month.\year},
xmin={2010-01-01},
xmax={2010-01-05},x tick label style={yshift=-3pt,xshift=-4pt,rotate=-30,anchor=west}]
\addplot table [x=date,y=value1] {data.dat};
\addplot table [x=date, y={create col/linear regression={y=value1}}] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

我尝试过x=\ticknum,但是没有用(而且如果我跳过一些日期的话也不是很安全data.dat)。

答案1

通常,您始终可以手动自定义刻度标签,而无需诉诸date coordinates insymbolic coords。为了记录在这里,我将展示如何(请参阅我的第二这个答案中的例子)即使我有更适合的东西(我的第一的例子)。

但是既然你要求一些“更高效的单行代码”,我通过结合可用的样式为你找到了一个xticklabels from tabledate coordinates in

\documentclass{minimal}
\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}
\begin{filecontents}{data.dat}
date            value1
2010-01-01      2
2010-01-02      10
2010-01-03      8
2010-01-04      15
\end{filecontents}
\usepackage{pgfplotstable}

% formats row \ticknum of the input table using '#3'
% #1: table name
% #2: column name
% #3: formatting instruction like \day.\month.\year
\newcommand\datelabelsfromtable[3]{%
    \begingroup
    \countdef\result=\count200 %
    \pgfplotstablegetelem{\ticknum}{#2}\of{#1}%
    \pgfcalendardatetojulian{\pgfplotsretval}{\result}%
    \pgfcalendarjuliantodate{\result}\year\month\day
    %
    #3%
    \endgroup
}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    x tick label style={yshift=-3pt,xshift=-4pt,rotate=-30,anchor=west},
    xticklabel={\datelabelsfromtable{data.dat}{date}{\day.\month.\year}},
    xtick=data,
]
\addplot table [x expr=\coordindex,y=value1] {data.dat};
\addplot table [x expr=\coordindex, y={create col/linear regression={y=value1}}] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

上面的答案有点复杂,因为公共\pgfcalendar*实用函数需要输入 TeX 计数器,而我不想用 来浪费一个\newcounter\countdef只是重用现有的计数器,但由于分配是本地组,因此效果有限。 该实用函数的其余部分相当简单:从输入表中提取所需的条目,将其解析为日期,然后将解析后的表示转换为所需的输出日期格式。 这不如库那么强大,dateplot因为它不会自动计算刻度标签,也不支持小时和分钟,但目前,它似乎是手头最“一行”的解决方案。

注意\addplot table使用x expr=\coordindex,即行号作为 x 坐标。


仅供参考,我想强调的是,手动分配刻度标签始终是可能的,就像任何其他绘图工具一样。由于xticklabels from table不使用预期的输出日期格式,我将使用以下内容作为最小示例:

\documentclass{minimal}
\usepackage{pgfplots}
\usepgfplotslibrary{dateplot}
\begin{filecontents}{data.dat}
date            value1
2010-01-01      2
2010-01-02      10
2010-01-03      8
2010-01-04      15
\end{filecontents}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}

\begin{axis}[
    x tick label style={yshift=-3pt,xshift=-4pt,rotate=-30,anchor=west},
    xticklabels={01.01.2010, 02.01.2010, 03.01.2010, 04.01.2010},
    xtick=data,
]
\addplot table [x expr=\coordindex,y=value1] {data.dat};
\addplot table [x expr=\coordindex, y={create col/linear regression={y=value1}}] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

结果与上面的完全相同。

相关内容