如何将文本和图像放置在精确的子图上方?

如何将文本和图像放置在精确的子图上方?

我想要画这样的东西:

在此处输入图片描述

我可以像这样画:

在此处输入图片描述

这是相同的代码:

\documentclass{article}
\usepackage{tikz,subfig}
\begin{document}

\begin{figure}
  \centering
  \subfloat[Iteration Domain for a Tile]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
  \subfloat[Convex Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
  \subfloat[Disjoint Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
  \subfloat[Disjoint Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
  \caption{Bounding boxes for disjoint union of data regions}
\end{figure}

\end{document}

现在,我面临两个问题:

  1. 如何将中心对齐的文本精确地放置在图 1(b)以及图 1(C)和(d)的上方?
  2. 如何仅在图 (b)、(c) 和 (d) 上方绘制一个矩形?

有什么办法吗?

答案1

你需要这样的东西,

\begin{figure}
  \centering
  \begin{tabular}[t]{cccc}
    &\multicolumn{3}{c}{
      \begin{tikzpicture}
        \draw (0,0) rectangle (10.0,0.8);
      \end{tikzpicture}
    }\\
  &{\bfseries Something}&\multicolumn{2}{c}{\bfseries Something}\\
  \subfloat[Iteration Domain for a Tile]{
....
  }&
  \subfloat[Convex Bounding Boxes]{
....
  }&
  \subfloat[Disjoint Bounding Boxes]{
....    
}&
  \subfloat[Disjoint Bounding Boxes]{
....    
}
\end{tabular}
  \caption{Bounding boxes for disjoint union of data regions}
\end{figure}

我的结果是这样的,

在此处输入图片描述

为了控制列间间距,使用\setlength{\tabcolsep}{some value} 和其他行间空间控制技术来控制垂直放置。

答案2

对于问题 1,使用tabular具有 3 个居中列的:

  \begin{tabular}{ccc} foo & foo & foo\\ 
  \subfloat[Iteration Domain for a Tile]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
 & 
  \subfloat[Convex Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
 & 
  \subfloat[Disjoint Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
  \subfloat[Disjoint Bounding Boxes]{
      \begin{tikzpicture}
        \draw (0,0) rectangle (3.8,3.8);
      \end{tikzpicture}
  }
\end{tabular}

答案3

另一个想法:将所有子图放在同一个 tikzpicture 中,这样您就可以使用 tikz 命令将标签放置在框中。您还可以使用 tikz 节点来包含子标题。

这里的问题是每个子标题的标签 (a)、(b) 等。有两种方法:

  1. 手动。自己编写 (a)、(b) 等作为子标题文本的一部分。这当然不是最佳选择,因为您无法\ref添加这些子标题,但如果您不需要这样做,这可能是一个简单的解决方案。
  2. 用作\subfloattikz 节点的内容,以便子标题自动编号和标记。

在下面的代码中,我采用了第二种方法。我使用的技术对其他类似问题也很有用。

\documentclass{article}
\usepackage{tikz,subfig}
\usetikzlibrary{positioning,calc}
\begin{document}

\def\subcaption#1#2{
  \node[subcaption=#1]{\subfloat[#2]{\hskip\linewidth}};
}

\begin{figure}
  \centering
      \begin{tikzpicture}
        \tikzset{
          box/.style = {draw, rectangle, minimum width=3.8cm, minimum height=3.8cm, node distance=2mm},
          subcaption/.style = {below=-\baselineskip of #1, text width=4.2cm, inner sep=0pt},
          something/.style = {above=2mm of #1, font=\sffamily\bfseries\footnotesize},
          red bar/.style = {fill=red, draw=black, ultra thick, minimum width=10cm, minimum height=4mm},
        }
        \node[box] (a) {};
        \node[box,right=of a] (b) {};
        \node[box,right=of b] (c) {};
        \node[box,right=of c] (d) {};

        \subcaption{a}{Iteration Domain for a Tile};
        \subcaption{b}{Convex Bounding Boxes};
        \subcaption{c}{Disjoint Bounding Boxes};
        \subcaption{d}{Disjoint Bounding Boxes};

        \node[something=b] {Something};
        \coordinate (aux) at ($(c.north)!.5!(d.north)$);
        \node[something=aux] {Something};
        \node[red bar, above=1cm of c] {};
      \end{tikzpicture}
  \caption{Bounding boxes for disjoint union of data regions}
\end{figure}
\end{document}

结果:

结果

相关内容