使用宏在 pgfplot/axis 内绘图

使用宏在 pgfplot/axis 内绘图

我想在里面实现甘特图功能pgfplots。为了绘制任务,我有一个宏来计算任务的开始和结束时间。但是,当我使用多个任务时,里面的值会被覆盖,因此它只显示单个任务。

\documentclass[10pt]{article}
\usepackage{pgfplots}

\begin{document}

\newcommand{\task}[7]{
    \pgfmathparse{#1/365+#2/12+#3}
    \edef\taskstart{\pgfmathresult}
    \pgfmathparse{#4/365+#5/12+#6}
    \edef\taskfinish{\pgfmathresult}

    \pgfmathparse{#7-0.4}
    \edef\bottom{\pgfmathresult}
    \pgfmathparse{#7+0.4}
    \edef\top{\pgfmathresult}

    \draw[blue,fill=blue!50!white] (axis cs:\taskstart,\bottom) rectangle (axis cs:\taskfinish,\top);
}

\begin{tikzpicture}
    \begin{axis}[xmin=2011,xmax=2013,ymin=0,ymax=10] 
        \task{26}{1}{2011}{23}{6}{2011}{1} % this is not drawn
        \task{26}{1}{2012}{23}{6}{2012}{3} % only this is drawn
    \end{axis}
\end{tikzpicture}

\end{document}

我知道这是一个扩展的问题,但是我必须承认我不知道如何在范围内处理它axis

答案1

正如您所注意到的,问题是由于变量的扩展而产生的。pgfplots收集所有语句直到\end{axis}然后执行它们。因此,您需要确保包含数据的命令包含正确的数据!您的问题是数据、和\taskstart\bottom定义为最后一个值。那是从。\taskfinish\top\task<2>

记住考虑所有命令TikZpgfplots术语已经充分扩展以便您获得正确的情节。

你可以使用这个来解决这个问题\newcommand

\newcommand{\task}[7]{
    \pgfmathparse{#1/365+#2/12+#3}
    \edef\taskstart{\pgfmathresult}
    \pgfmathparse{#4/365+#5/12+#6}
    \edef\taskfinish{\pgfmathresult}

    \pgfmathparse{#7-0.4}
    \edef\bottom{\pgfmathresult}
    \pgfmathparse{#7+0.4}
    \edef\top{\pgfmathresult}
    \edef\tmp{%
        \noexpand\draw[blue,fill=blue!50!white] (axis cs:\taskstart,\bottom) rectangle
        (axis cs:\taskfinish,\top);}
    \tmp
}

生成的图像将是:

在此处输入图片描述

相关内容