我认为 pgfgantt 中的标题和栏之间的间距太大。有没有办法减少它?例如,此代码
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.3cm,
hgrid,
vgrid={draw=none,dotted},
time slot format = isodate-yearmonth,
compress calendar,
today=2014-4,
]{2013-05}{2017-02}
\gantttitle{2013}{8}
\gantttitlelist{2014,2015,2016}{12}
\gantttitle{2017}{2}\\
\gantttitlelist[title label font=\tiny ,y unit title = 0.7cm]{5,...,12}{1}
\gantttitlelist[title label font=\tiny ,y unit title = 0.7cm]{1,...,12}{1}
\gantttitlelist[title label font=\tiny ,y unit title = 0.7cm]{1,...,12}{1}
\gantttitlelist[title label font=\tiny ,y unit title = 0.7cm]{1,...,12}{1}
\gantttitlelist[title label font=\tiny ,y unit title = 0.7cm]{1,2}{1}\\
\ganttbar{Task 1}{2013-05}{2014-08}\\
\ganttbar{Task 2}{2013-12}{2015-05}\\
\ganttbar{Task 3}{2014-12}{2016-11}
\end{ganttchart}
渲染图片时,月份和任务之间的间距太大……难以阅读。有办法吗?谢谢
答案1
让我们从一个例子开始:
甘特图 a、b 和 c 使用下一个声明:
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.2cm,
y unit title = 1.2cm,
hgrid={ultra thick,draw},
time slot format = isodate-yearmonth,
compress calendar,
title/.append style={opacity=.5},
]{2013-05}{2013-12}
重要的参数是y unit title
(在您的示例中未明确声明,则固定为其默认值:1cm)。此参数固定每个的高度title bar
。
为了更好地理解发生了什么,我还画了一些红线,y unit title
它们之间的距离为 1.2 厘米()。
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},title label font=\tiny]{5,...,12}{1}\\
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
前面四行用于绘制图 a。如您所见,第一个标题栏位于最高点,第二个标题栏位于y unit title
最高点以下单位,因为\\
第一个标题栏之后\gantttitle
声明/计数换行符。并且第一个标题栏\ganttbar
位于2*y unit title
最高点以下单位,因为\\
第二个标题行之后在计数器中添加了换行符。
标题栏之间和标题栏与第一个任务栏之间的空白是由于y unit title
和之间的差异造成的title height
。此值用于固定title node's height
默认情况下哪个是0.6*y unit height
。
因此,如果您不希望标题和任务栏之间有任何空白,则需要使用title height=1
。结果将类似于图 d。(在这种情况下,我还声明了y unit title=0.6cm
。)
图 b 和 c 将有助于理解当我们使用local y unit height
您示例中的 as 或\\
我的评论中的内容时会发生什么。图 b 的代码为:
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15}, title label font=\tiny,
y unit title=.8cm]{5,...,12}{1}\\
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
我保留了\\
第二个标题,但包含y unit title=0.8cm
在其选项中。如您所见,第二个标题被放置在y unit title
原点下方的单位处,但现在这个值是当地的0.8 厘米,而不是全球的1.2 厘米。第二个标题栏与第一个标题栏重叠。但是,由于\\
在第二个标题栏之后使用,因此第一个任务栏仍然放在2*y unit title
全球的低于原点的单位,在第一个任务栏前留下大量空白。
图 c 是使用以下代码绘制的:
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},title label font=\tiny,
y unit title=.6cm]{5,...,12}{1}
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
与图 b 中使用的代码有两点不同。第一点是y unit title=0.6cm
在第二个标题栏选项中。这个短值更清楚地表明了第二个栏如何与第一个栏重叠。
第二个标题栏后缺少第二个差异\\
。结果是代码只计算了一个标题栏,第一个任务栏仅位于原点下方 1.2 厘米处,但由于第二个标题栏因本地y unit title
值而放错位置,结果有时可以接受。这就是我发表评论的原因,它适用于您的特定示例,但无法解决实际问题。
因此,避免(或减少)标题和第一个任务之间的空白的解决方案是为选择一个好的值title height
。使用title height=1
,标题节点将具有y unit title
高度。默认值为 0.6,因此 0.4*y 单位标题是标题栏和任务栏之间的空白。
示例图使用的完整代码为:
\documentclass[tikz,border=3mm]{standalone}
\usepackage{pgfgantt}
\begin{document}
\begin{tikzpicture}
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.2cm,
y unit title = 1.2cm,
hgrid={ultra thick,draw},
time slot format = isodate-yearmonth,
compress calendar,
title/.append style={opacity=.5},
% today=2014-4,
]{2013-05}{2013-12}
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},
title label font=\tiny]{5,...,12}{1}\\
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
\end{ganttchart}
\foreach \i in {0,...,4}
\draw[thin, red] (-.5,-\i*1.2cm)-- ++(0:3.5);
\node[above] at (1.25,0) {a)};
\begin{scope}[xshift=4cm]
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.2cm,
y unit title = 1.2cm,
hgrid={ultra thick,draw},
time slot format = isodate-yearmonth,
title/.append style={opacity=.5},
compress calendar,
]{2013-05}{2013-12}
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},
title label font=\tiny,
y unit title=.8cm]{5,...,12}{1}\\
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
\end{ganttchart}
\foreach \i in {0,...,4}
\draw[thin, red] (-.5,-\i*1.2cm)-- ++(0:3.5);
\node[above] at (1.25,0) {b)};
\end{scope}
\begin{scope}[xshift=8cm]
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.2cm,
y unit title = 1.2cm,
hgrid={ultra thick,draw},
time slot format = isodate-yearmonth,
title/.append style={opacity=.5},
compress calendar,
]{2013-05}{2013-12}
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},
title label font=\tiny,
y unit title=.6cm]{5,...,12}{1}
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
\end{ganttchart}
\foreach \i in {0,...,4}
\draw[thin, red] (-.5,-\i*1.2cm)-- ++(0:3.5);
\node[above] at (1.25,0) {c)};
\end{scope}
\begin{scope}[xshift=12cm]
\begin{ganttchart}[ x unit = 0.30cm,
y unit chart = 1.2cm,
y unit title = 0.6cm,
title height=1,
hgrid={ultra thick,draw},
time slot format = isodate-yearmonth,
title/.append style={opacity=.5},
compress calendar,
]{2013-05}{2013-12}
\gantttitle[title/.append style={fill=blue!15}]{2013}{8}\\
\gantttitlelist[title/.append style={fill=green!15},
title label font=\tiny]{5,...,12}{1}\\
\ganttbar{Task 1}{2013-05}{2013-10}\\
\ganttbar{Task 1}{2013-09}{2013-12}
\end{ganttchart}
\foreach \i in {0,...,4}
\draw[thin, red] (-.5,-\i*1.2cm)-- ++(0:3.5);
\node[above] at (1.25,0) {d)};
\end{scope}
\end{tikzpicture}
\end{document}