我是 tikz 的新手,我正在尝试绘制附加的图像。
我尝试绘制如下的形状,但是有几个问题。
- 如何将每个区域的标签定位到虚线框的左上角?
是否可以在 RegionA 节点中水平/垂直居中绘制 NodeA1、 NodeA2 和 NodeA3?- 是否可以相对于区域 A(即下方 1 厘米)绘制区域 B?
- 如何绘制连接节点和边中心的线?例如 NodeA1 到 NodeA2 和 NodeA3?
- 如何从 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
创建
RegionA
节点后,您可以按如下方式添加新节点:\node [below right] at (RegionA.north west) {Region A};
这可能是 TikZ 中被问到最多的问题之一。pgf-tikz 中的垂直线和水平线展示了几种方法。在下面的代码中,我采用了略有不同的方法,使用相对坐标后跟路径
|-
(参见TikZ:箭头的 |- 符号到底起什么作用?)。是的。下面的代码演示了一种可能的方法,尽管这种方法假设两个区域的大小相同。
一般来说,如果要指定线离开/进入节点的点,请指定锚点。例如,
nodeA.east
是节点的右侧。除了north
、south
、west
、east
、north east
等south west
,您还可以指定度数。例如,nodeA.45
与 相同nodeA.north east
,并且nodeA.90
是nodeA.north
。我假设主节点应该放在上方
RegionA
。该线是使用-|
坐标规范绘制的(请参阅第 2 点中的链接)。
当然,还有其他几种方法可以绘制这样的图表。例如使用树或\matrix
绘制两个子结构。
注意我稍微简化了一些东西。我将 移到了node distance
选项中,并从所有单个节点中tikzpicture
删除,因为这些设置包含在样式中。我还设置了该样式,并删除了。不过这种方法没有错,所以如果你喜欢它,就用它吧。draw, rectangle
block
align=left
tabular
tabular
\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}