关于如何在 TIKZ 中绘制图表的建议

关于如何在 TIKZ 中绘制图表的建议

我是 tikz 的新手,我正在尝试绘制附加的图像。

在此处输入图片描述

我尝试绘制如下的形状,但是有几个问题。

  1. 如何将每个区域的标签定位到虚线框的左上角?

  2. 是否可以在 RegionA 节点中水平/垂直居中绘制 NodeA1、 NodeA2 和 NodeA3?
  3. 是否可以相对于区域 A(即下方 1 厘米)绘制区域 B?
  4. 如何绘制连接节点和边中心的线?例如 NodeA1 到 NodeA2 和 NodeA3?
  5. 如何从 Master 到 NodeA1 和 NodeB1 画线?

这是我已经完成的基本代码。在此代码中,我绘制了基本形状,并尝试使用绝对坐标定位它们并连接节点之间的线。

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{positioning}

\tikzset{
block/.style={rectangle, draw, fill=blue!10, rounded corners, text centered}
}

\begin{document}
\begin{tikzpicture}

%Master 
\node[rectangle, draw, block] (nodeA1) {\begin{tabular}{l} Master Label 1 \\ Node Master 2 \end{tabular}};

%Region A
\node [label=left, style=dashed, minimum width=15cm, minimum height = 5cm, draw] (RegionA) {Region A};
\node[rectangle, draw, block, below =-3.0 cm of RegionA] (nodeA1) {\begin{tabular}{l} Node A1 Label 1 \\ Node A1 Label 2 \end{tabular}};

\node[rectangle, draw, block, above right = 0.25cm and 2cm of nodeA1] (nodeA2) {\begin{tabular}{l} Node A2 Label 1 \\ Node A2 Label 2 \end{tabular}};

\node[rectangle, draw, block, below right = 0.25cm and 2cm of nodeA1] (nodeA3) {\begin{tabular}{l} Node A3 Label 1 \\ Node A3 Label 2 \end{tabular}};

\draw  (nodeA1) -- (nodeA2);
\draw  (nodeA1) -- (nodeA3);


% Region B
\node [style=dashed, minimum width=15cm, minimum height = 5cm, draw] (RegionB) at (0, -6cm) {Region B};

\node[rectangle, draw, block, below =-3.0 cm of RegionB] (nodeB1) {\begin{tabular}{l} Node B1 Label 1 \\ Node B1 Label 2 \end{tabular}};

\node[rectangle, draw, block, above right = 0.25cm and 2cm of nodeB1] (nodeB2) {\begin{tabular}{l} Node B2 Label 1 \\ Node B2 Label 2 \end{tabular}};

\node[rectangle, draw, block, below right = 0.25cm and 2cm of nodeB1] (nodeB3) {\begin{tabular}{l} Node B3 Label 1 \\ Node B3 Label 2 \end{tabular}};

\draw  (nodeA1) -- (nodeA2);
\draw  (nodeA1) -- (nodeA3);


\end{tikzpicture}
\end{document}

答案1

  1. 创建RegionA节点后,您可以按如下方式添加新节点:

    \node [below right] at (RegionA.north west) {Region A};
    
  2. 这可能是 TikZ 中被问到最多的问题之一。pgf-tikz 中的垂直线和水平线展示了几种方法。在下面的代码中,我采用了略有不同的方法,使用相对坐标后跟路径|-(参见TikZ:箭头的 |- 符号到底起什么作用?)。

  3. 是的。下面的代码演示了一种可能的方法,尽管这种方法假设两个区域的大小相同。

  4. 一般来说,如果要指定线离开/进入节点的点,请指定锚点。例如,nodeA.east是节点的右侧。除了northsouthwesteastnorth eastsouth west,您还可以指定度数。例如,nodeA.45与 相同nodeA.north east,并且nodeA.90nodeA.north

  5. 我假设主节点应该放在上方RegionA。该线是使用-|坐标规范绘制的(请参阅第 2 点中的链接)。

当然,还有其他几种方法可以绘制这样的图表。例如使用树或\matrix绘制两个子结构。

注意我稍微简化了一些东西。我将 移到了node distance选项中,并从所有单个节点中tikzpicture删除,因为这些设置包含在样式中。我还设置了该样式,并删除了。不过这种方法没有错,所以如果你喜欢它,就用它吧。draw, rectangleblockalign=lefttabulartabular

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,fit}

\tikzset{
block/.style={
   rectangle,
   draw,
   fill=blue!10,
   rounded corners,
   align=left, % allows for line breaks in node without tabular
   inner sep=\tabcolsep
   }
}

\begin{document}
\begin{tikzpicture}[node distance=0.25cm and 2.5cm]

%Region A
\node[block] (nodeA1) { Node A1 Label 1 \\ Node A1 Label 2 };

\node[block, above right=of nodeA1] (nodeA2) { Node A2 Label 1 \\ Node A2 Label 2 };

\node[block, below right=of nodeA1] (nodeA3) { Node A3 Label 1 \\ Node A3 Label 2 };

\draw  (nodeA1.east) -- ++(1.5cm,0) |- (nodeA2);
\draw  (nodeA1.east) -- ++(1.5cm,0) |- (nodeA3);

\node [
   dashed,
   draw,
   inner ysep=1cm,inner xsep=1.5cm,
   fit=(nodeA1)(nodeA2)(nodeA3)] (RegionA) {};

% label for region
\node [below right] at (RegionA.north west) {Region A};

% Region B
\node [
   dashed,
   draw,
   inner ysep=1cm,inner xsep=1.5cm,
   fit=(nodeA1)(nodeA2)(nodeA3), % same size as RegionA
   below=1cm of RegionA % but placed below it
   ] (RegionB) {};

\node [below right] at (RegionB.north west) {Region B};


\node[block] (nodeB1) at (RegionB -| nodeA1) { Node B1 Label 1 \\ Node B1 Label 2 };

\node[block, above right = of nodeB1] (nodeB2) { Node B2 Label 1 \\ Node B2 Label 2 };

\node[block, below right = of nodeB1] (nodeB3) { Node B3 Label 1 \\ Node B3 Label 2 };

\draw  (nodeB1.east) -- ++(1.5cm,0) |- (nodeB2);
\draw  (nodeB1.east) -- ++(1.5cm,0) |- (nodeB3);


% master node
\node [above=of RegionA, xshift=-2.5mm, block] (nodeM) {Master Label 1 \\ Node Master 2};

\draw (nodeM) -- (nodeM |- nodeB1);


\end{tikzpicture}

\end{document}

相关内容