如何用 Latex/TikZ 重现该图形?

如何用 Latex/TikZ 重现该图形?

在此处输入图片描述我想在 Latex 中正确重现此图形。我有几个导入的图形(.eps,但我想这并不重要),我想在其中一些图形之间画箭头(而不是线条)(如图所示)。箭头可能朝任何方向(不一定是垂直或水平)。理想情况下,即使我更改图形的大小/位置,箭头也会保持不变。最实用的方法是什么?有人能给我提供一个最小的工作示例吗?我真的不知道如何开始

答案1

我们将问题分为两部分:

  1. 放置节点并连接它们(无需森林或其他包)
  2. 在节点内插入图像

为了保持一切整洁,我们还创建一些styles,这样我们就不需要一遍又一遍地重复自己。

样式figNode负责在节点中心插入图片。此外,样式mySimpleArrow定义箭头和样式myBlock定义节点的最小尺寸,两者都有默认设置,因此您可以通过 定义样式的全局行为方式,或在特定节点内进行本地定义mySimpleArrow={yellow}{red}

第一个\begin{scope}块放置我们所有的节点,第二个块定义节点之间的路径。

我给出了两个图。第一个图有标签,节点被移位right=<distance> of <node>。它解决了我们的第一个问题。现在,为了解决第二个问题,我们只需添加figNode样式。不幸的是,right=...语法会干扰figNode,所以我创建了第二个图,其中节点被放置在at (x,y)坐标中。

最后,为了获得您的结果,只需将里面的内容替换\includegraphics为您的数字即可。

\documentclass{article}
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{pgfplots}
\usetikzlibrary{positioning}
\tikzset{figNode/.style={
    path picture={
      \node at (path picture bounding box.center) {#1};}}
}
\tikzset{mySimpleArrow/.style n args={2}{
    >={latex[#1]},
    every path/.style={draw=#2}
  },
  mySimpleArrow/.default={black}{black}
}
\tikzset{myBlock/.style n args={2}{
    every node/.style={rectangle,draw, text=black,
      minimum width=#1, minimum height=#2,}
  },
  myBlock/.default={1cm}{1cm}
}
\begin{document}
\begin{tikzpicture}[very thick]
  \begin{scope}[shift={(3.0,-0.5)},myBlock]
    \node [label=above:Road] (A) at (-6,6) {$A$};
    \node[right=0.5 of A] (B) [label=above:Metal]{$B$};
    \node[right=0.5 of B] (C) [label=above:Dirt]{$C$};
    \node[right=0.5 of C] (D) [label=above:Roof]{$D$};
    \node[right=0.5 of D] (E) [label=above:Grass 1]{$E$};
    \node[right=0.5 of E] (F) [label=above:Grass 2]{$F$};
    \node[right=0.5 of F] (G) [label=above:Trees]{$G$};
    
    \node (H) at (-5,3.5) [label=below left:Road + Metal]{$H$};
    
    \node (I) at (-3.5,2) [label=below left:Road + Metal + Dirt]{$I$};
    \node[right=3 of I] (J) [label=below:Grass]{$J$};
    
    \node (K) at (-2,0.5) [label=below:Non-vegetation]{$K$};
    \node[right=3 of K] (L) [label=below:Vegetation]{$L$};
  \end{scope}
  
  \begin{scope}[mySimpleArrow]
    \path[->] (K) -- (I);
    \path[->] (K) -- (D);
    \path[->] (I) -- (H);
    \path[->] (I) -- (C);
    \path[->] (H) -- (A);
    \path[->] (H) -- (B);
    
    \path[->] (L) -- (J);
    \path[->] (L) -- (G);
    \path[->] (J) -- (E);
    \path[->] (J) -- (F);
  \end{scope}
\end{tikzpicture}
\begin{tikzpicture}[very thick]
  \begin{scope}[shift={(3.0,-0.5)},myBlock]
    % \draw [figNode={\includegraphics{example-image-a}},label=above:Road] coordinate(A) (-6,6) rectangle ++(1,1);
    \node [label=above:Road,figNode={\includegraphics[width=1cm]{example-image-a}}] (A) at (-6,6) {};
    \node[figNode={\includegraphics[width=1cm]{example-image-b}}](B) at (-4.5,6) [label=above:Metal]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-c}}] (C) at (-3,6) [label=above:Dirt]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-duck}}] (D) at (-1.5,6) [label=above:Roof]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-1x1}}] (E) at (0,6) [label=above:Grass 1]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-a}}] (F) at (1.5,6) [label=above:Grass 2]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-b}}] (G) at (3,6) [label=above:Trees]{};
    
    \node[figNode={\includegraphics[width=1cm]{example-image-c}}] (H) at (-5,3.5) [label=below left:Road + Metal]{};
    
    \node[figNode={\includegraphics[width=1cm]{example-image-duck}}] (I) at (-3.5,2) [label=below left:Road + Metal + Dirt]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-1x1}}] (J) at (0.5,2) [label=below:Grass]{};
    
    \node[figNode={\includegraphics[width=1cm]{example-image-a}}] (K) at (-2,0.5) [label=below:Non-vegetation]{};
    \node[figNode={\includegraphics[width=1cm]{example-image-b}}] (L) at (2,0.5) [label=below:Vegetation]{};
  \end{scope}
  
  \begin{scope}[mySimpleArrow]
    \path[->] (K) -- (I);
    \path[->] (K) -- (D);
    \path[->] (I) -- (H);
    \path[->] (I) -- (C);
    \path[->] (H) -- (A);
    \path[->] (H) -- (B);
    
    \path[->] (L) -- (J);
    \path[->] (L) -- (G);
    \path[->] (J) -- (E);
    \path[->] (J) -- (F);
  \end{scope}
\end{tikzpicture}
\end{document}

第一个带有字母标记节点的图。

在此处输入图片描述

第二个图形与节点内的图形。

在此处输入图片描述

相关内容