使用子图环境以多行多列的方式排列网格中的图像

使用子图环境以多行多列的方式排列网格中的图像

我正在尝试为乳胶文档中的图像设置基于网格的结构。

预期布局 目前,我使用图形环境下的表格来实现这一点。但是,结果对齐不佳并且超出了框架。如何正确对齐图像?

\begin{figure*}
% \setlength{\abovecaptionskip}{6pt}
% \setlength{\belowcaptionskip}{6pt}
\centering
\begin{tabular}{ccc}
& \subfloat[B]{\includegraphics[width=0.30\textwidth]{images/2.png}} & 
\subfloat[C]{\includegraphics[width=0.30\textwidth]{images/3.png}} \\ 
\multirow[t]{-2}{*}{\subfloat[A]{\includegraphics[width=0.40\textwidth]{images/1.png}}} &
\multicolumn{2}{c}{\subfloat[D]{\includegraphics[width=0.60\textwidth]{images/4.png}}} \\
\end{tabular}
\caption{Many figures}
\end{figure*}

当前输出如下。黑线仅表示使用 showframe 进行调试时启用的框架边框。通过编辑宽度百分比,我可以改进它,但并不完美。

实际布局

例如,使用子图是否可以更好地做到这一点?另外,我想将第一个大型垂直图像标记为 (a),但它被标记为 (c)

任何帮助/文档/教程都值得赞赏。谢谢!

更新 1

根据@liandriis 的要求,我附上了使用的图像(a、b、c、d)尺寸:

  • 答:417 x 476,Imgur: P0NIeKI
  • b:255 x 254,Imgur: 4JROoAO
  • c:301 x 255,Imgur: xcAkKXp
  • 尺寸:565 x 203,Imgur: qvlItEf

更新 2 以下是我根据@David_Carlisle 分享的方法获得的结果

使用图片

问题在于如何将字幕放到合适的位置。此外,需要反复试验才能得到正确的数字,但为了在给定的文档/环境中实现完美定位,这一切都是值得的。

更新 3

因此,继续遵循 @David_Carlisle 的建议,我现在能够完美地获得所有位置。正如我之前提到的,它只需要微调位置值。我仍在尝试了解这些数字是什么(绝对位置或从哪里偏移)。我仍然遇到的问题是 1) 子图和主图的图形计数按顺序递增(即 a、b、c、d、5 而不是 a、b、c、d、1)。2) 子图的标题不可见。

\begin{figure}
\begin{picture}(0,240)
 \renewcommand\thefigure{\alph{figure}}%
 \renewcommand\caption[1]{\refstepcounter{figure}%
                          \par\centering(\thefigure)\par}%

  \put(0,0){\begin{minipage}[b]{.43\textwidth}
   \includegraphics[width=\linewidth]{images/a.png}
   \caption{zz a test}
    \end{minipage}}

  \put(228,130){\begin{minipage}[b]{.24\textwidth}
   \includegraphics[width=\linewidth]{images/b.png}
   \caption{zz b}
    \end{minipage}}

  \put(370,130){\begin{minipage}[b]{.285\textwidth}
   \includegraphics[width=\linewidth]{images/c.png}
   \caption{zz c}
    \end{minipage}}

  \put(228, 0){\begin{minipage}[b]{.56\textwidth}
   \includegraphics[width=\linewidth]{images/d.png}
   \caption{zz d}
    \end{minipage}}

  \end{picture}

 \caption{Figures zzz}
\end{figure}

已更新正确位置

更新 4 根据@Zarko 分享的这个答案,我使用了 minipages,经过一些微调后,我能够实现所需的结果。在此与感兴趣的人分享:

\begin{figure*}
    \begin{minipage}{0.425\textwidth}%
    \begin{subfigure}{\linewidth}%
        \includegraphics[width=\textwidth]{images/a.png}
        \caption{A figure.}
        \label{fig:merge-scenario}
    \end{subfigure}
    \end{minipage}%
    \hspace{0.5mm}
    \begin{minipage}{0.545\textwidth}%
        \begin{minipage}{0.47\textwidth}%
            \begin{subfigure}{\linewidth}%
                \includegraphics[width=\linewidth]{images/b.png}
                \caption{State A} 
                \label{fig:case-a}
            \end{subfigure}
        \end{minipage}
        \begin{minipage}{0.55\textwidth}%
            \begin{subfigure}{\linewidth}%
                \includegraphics[width=\linewidth]{images/c.png}
                \caption{State A} 
                \label{fig:case-a}
            \end{subfigure}
        \end{minipage}
        \begin{subfigure}{\textwidth}%
            \includegraphics[width=1.03\linewidth]{images/d.png}
            \caption{State C} 
            \label{fig:case-c}
        \end{subfigure}
    \end{minipage}
    \caption{Another figure.}
\end{figure*}

使用小页面

答案1

对图像进行分组时,如果它们不是像这样的人工矩形,则最好“用眼睛”进行调整,而不是仅仅机械地定位它们,而不考虑由于图像中的白色空间或对比区域造成的任何光学错位。

在这里我将它们定位在手动选择的坐标上。我还缩放了图像的高度和深度,以获得不同纵横比的图像。通常最好只在一个方向上缩放以避免失真。

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx}

\begin{document}

\begin{figure}

  \begin{picture}(0,200)
 \renewcommand\thefigure{\alph{figure}}%
 \renewcommand\caption[1]{\refstepcounter{figure}%
                          \par\centering(\thefigure)\par}%

  \put(0,-10){\begin{minipage}[b]{.2\textwidth}
   \includegraphics[width=\linewidth, height=6cm]{example-image}
   \caption{zz a}
    \end{minipage}}

  \put(80,120){\begin{minipage}[b]{.2\textwidth}
   \includegraphics[width=\linewidth, height=2cm]{example-image}
   \caption{zz b}
    \end{minipage}}

  \put(160,120){\begin{minipage}[b]{.5\textwidth}
   \includegraphics[width=\linewidth, height=2cm]{example-image}
   \caption{zz c}
    \end{minipage}}

  \put(80,0){\begin{minipage}[b]{.7\textwidth}
   \includegraphics[width=\linewidth, height=3cm]{example-image}
   \caption{zz d}
    \end{minipage}}

  \end{picture}

 \caption{Figures zzz}

\end{figure}

\noindent X\dotfill X
\end{document}

答案2

感谢@DavidCarlisle、@Zarko 提供的所有意见以及这个有用的答案https://tex.stackexchange.com/a/494135/204652

我在这里整理我的更新作为答案,因为它恰好解决了这个问题。关键思想是有效地使用迷你页面来排列图形环境中的元素。与上一个答案不同,此示例显示了单个图像分布在多行或多列上的情况。这种方法可以推广到任何其他布局。

\usepackage{subcaption}
\usepackage{graphicx}
\begin{figure*}
    \begin{minipage}{0.425\textwidth}%
    \begin{subfigure}{\linewidth}%
        \includegraphics[width=\textwidth]{images/a.png}
        \caption{A figure.}
        \label{fig:merge-scenario}
    \end{subfigure}
    \end{minipage}%
    \hspace{0.5mm}
    \begin{minipage}{0.545\textwidth}%
        \begin{minipage}{0.47\textwidth}%
            \begin{subfigure}{\linewidth}%
                \includegraphics[width=\linewidth]{images/b.png}
                \caption{State A} 
                \label{fig:case-a}
            \end{subfigure}
        \end{minipage}
        \begin{minipage}{0.55\textwidth}%
            \begin{subfigure}{\linewidth}%
                \includegraphics[width=\linewidth]{images/c.png}
                \caption{State A} 
                \label{fig:case-a}
            \end{subfigure}
        \end{minipage}
        \begin{subfigure}{\textwidth}%
            \includegraphics[width=1.03\linewidth]{images/d.png}
            \caption{State C} 
            \label{fig:case-c}
        \end{subfigure}
    \end{minipage}
    \caption{Another figure.}
\end{figure*}

其结果如下:

图像网格布局

请注意,代码中使用的数字是硬编码的,以匹配图像的纵横比。这需要根据需要进行适当调整。

希望以上内容能够帮助那些对在 Latex 中以网格形式排列图像感兴趣的人。

相关内容