如何更改节点的大小以在其中添加一些文本。以下是代码,第二个图表是根据此代码生成的。
\begin{figure}
\usetikzlibrary{trees}
\begin{tikzpicture}[sibling distance=2.8cm,level distance=2.8cm,
box/.style={
shape=rectangle,
font=\small,
draw,
align=center,
minimum height=1.5cm,
text width=1.75cm,
top color=white,
bottom color=blue!20}
]
\node [box,text width=3cm] {Indoor\\Localization\\System} [edge from parent fork down]
child { node [box] {Proximity} }
child { node [box] {Angulation}
child { node [box] {Received Angle}
child [sibling distance=2.2cm] { node [box] {AOA}
child [sibling distance=2.2cm] { node [box] {Antenna array} }}}}
child { node [box] {Scene Analysis} }
child [sibling distance=3cm] { node [box] (lat) {Lateration}
child [sibling distance=4.5cm] { node [box] {Propagation time}
child [sibling distance=2.2cm] { node [box] {TOA}
child [sibling distance=2.2cm] { node [box] {RF or ultrasonic} }}
child [sibling distance=2.2cm] { node [box] {TDOA}
child [sibling distance=2.2cm] { node [box] {RF or Ultrasonic} }} }
child [sibling distance=3.4cm]{ node [box] (tof) {Signal Strength}
child [sibling distance=2.2cm] { node [box] {RSS}
child [sibling distance=2.2cm] { node [box] {RF} }}} };
\end{tikzpicture}
\caption{Overview of Localization}
\end{figure}
答案1
使用您的代码,我无法重现您的图像。它看起来不错。无论如何,我稍微减少了您的代码并选择了新的同级距离。通过这些更改,我获得了以下图片:
\documentclass[tikz, border=3mm]{standalone}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}[sibling distance=2.8cm,level distance=2.8cm,
box/.style={
shape=rectangle,
font=\small,
draw,
align=center,
minimum height=1.3cm,
text width=1.75cm,
top color=white,
bottom color=blue!20},
level 1/.style = {sibling distance=2.6cm},
level 2/.style = {sibling distance=3.4cm},
level 3/.style = {sibling distance=2.4cm},
]
\node [box,text width=3cm] {Indoor\\Localization\\System} [edge from parent fork down]
child { node [box] {Proximity} }
child { node [box] {Angulation}
child { node [box] {Received Angle}
child { node [box] {AOA}%sibling distance=2.2cm
child { node [box] {Antenna array} }}}}%[sibling distance=2.2cm]
child { node [box] {Scene Analysis} }
child { node [box] (lat) {Lateration}%[sibling distance=3cm]
child { node [box] {Propagation time}%[sibling distance=4.5cm]
child { node [box] {TOA}%[sibling distance=2.2cm]
child { node [box] {RF or ultrasonic} }}%[sibling distance=2.2cm]
child [sibling distance=2.2cm] { node [box] {TDOA}
child { node [box] {RF or Ultrasonic} }} }%[sibling distance=2.2cm]
child { node [box] (tof) {Signal Strength}%[sibling distance=3.4cm]
child { node [box] {RSS}%[sibling distance=2.2cm]
child { node [box] {RF} }}} };%[sibling distance=2.2cm]
\end{tikzpicture}
\end{document}
在代码中我注释了所有兄弟距离,并用level
样式定义它们。
答案2
这个答案说明了两件事:
那森林解决方案消除了手动指定兄弟距离的需要——树会自动打包以创建紧凑而简洁的形式;
实验包正义树可用于添加原始图表右侧所示的标签,以及森林可以自动添加箭头。
我不知道您是否对标签感兴趣,因为您没有提到它,但我需要测试用例,所以不妨趁此机会将结果强加给粗心大意的人。
如果您希望在家尝试,请告诉我您想要一份副本,因为它尚不容易获得(即不在 CTAN 上)。
这是结果,您可以决定是否继续阅读。我不知道最上面的箭头是否应该与其他箭头对齐,还是与它指向的节点对齐。我选择了后者,但前者只需要稍微修改一下。
最大的优势森林是它在绘制树时提供的强大功能和灵活性,尤其是自动化和一致格式的潜力。默认情况下,它还会绘制非常紧凑的树。
正义树是森林包装器旨在做一件事:自动将标签对齐到树的左侧或右侧,允许将标签内容指定为树的一部分,并提供几个键来定制标签的格式。
前言
加载代码:
\usepackage{justtrees}% v 0.07
对于箭头提示:
\usetikzlibrary{arrows.meta}
我们将使用该edges
库,因为它允许我们轻松获得等效的edge from parent fork down
。
\useforestlibrary{edges}
应用edges
默认设置。如果您不想将其应用于forest
文档中的每个树,请在本地 TeX 范围内执行此操作。
\forestapplylibrarydefaults{edges}
身体
正义树提供一个新环境justtree
,该环境采用单个强制参数,该参数应提供树的序言。该参数可以为空,但不能省略该参数。
\begin{justtree}
{
得到边缘处的方形转弯。
forked edges,
我们希望将某些内容应用于树中的每个节点。这实际上是对您的样式box
进行了一些略微修改以实现兼容性。
for tree={
font=\small,
draw,
而不是align=center
,我们需要这个。(虽然我不确定为什么。)
text centered,
minimum height=1.5cm,
text width=1.75cm,
我们需要这样做来保持一切一致。
anchor=north,
top color=white,
bottom color=blue!20,
如果我们想要无文本。否则,省略。
font=\sffamily,
},
这是右侧标签的格式。我们将它们向右移动,以便为箭头留出空间。
just format={xshift=25pt, font=\sffamily},
此代码负责绘制箭头。我们延迟它以确保主树中所有节点的位置都已计算,这样我们的箭头就不会出现在意想不到的地方。
before drawing tree={
这有点复杂。它能用,但我不确定它是否正确。手册需要为像我这样的白痴提供更简单的例子(或者只是一些例子);)!
它从一个节点走到另一个节点,每一步都做一些事情。r
是树的根。L
是最后一片叶子,即右下角节点。current and ancestors
然后从最后一片叶子向上移动回到根,即右下角节点 -> 父母 -> 祖父母 -> 曾祖父母 -> ... -> 根。
for nodewalk={rL,current and ancestors}{
我们不需要级别0
或1
树的箭头。(0
使用 时,级别实际上是不可见的justtree
。)因此,我们在每一步测试当前级别,如果小于 2,则不执行任何操作,否则绘制箭头,将其与适当的锚点对齐,以与最终位于右侧和当前节点的标签对齐。
if={level()<2}{}{tikz+={\draw [Stealth-] (.mid east) ++(2.5pt,0) -- ++(15pt,0);},},
},
},
}
这是序言。现在树在森林的括号表示法。请注意,我们可以将常规 TikZ 选项添加到节点和森林将会传递它们。
[Indoor\\Localization\\System, text width=3cm
右侧的标签使用 指定just=<label content>
。它只需要传递到正确级别的节点 - 哪一个并不重要。
[Proximity, just={Positioning}
]
[Angulation
[Received\\Angle
[AOA
[Antenna\\array
]
]
]
]
[Scene\\Analysis
]
[Lateration
还有一些标签。
[Propagation\\time, just=Variable
[TOA
[RF or\\ultrasonic, just=Device
]
]
[TDOA
[RF or\\Ultrasonic
]
]
]
[Signal\\Strength
最终标签。这些标签分散在树中,只是为了表明它们被指定在哪里并不重要。
[RSS, just=Ranging
[RF
]
]
]
]
]
关闭环境我们就完成了。
\end{justtree}
完整代码:
\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{justtrees}% v 0.07
\usetikzlibrary{arrows.meta}
\useforestlibrary{edges}
\forestapplylibrarydefaults{edges}
\begin{document}
\begin{justtree}
{
forked edges,
for tree={
font=\small,
draw,
text centered,
minimum height=1.5cm,
text width=1.75cm,
anchor=north,
top color=white,
bottom color=blue!20,
font=\sffamily,
},
just format={xshift=25pt, font=\sffamily},
before drawing tree={
for nodewalk={rL,current and ancestors}{
if={level()<2}{}{tikz+={\draw [Stealth-] (.mid east) ++(2.5pt,0) -- ++(15pt,0);},},
},
},
}
[Indoor\\Localization\\System, text width=3cm
[Proximity, just={Positioning}
]
[Angulation
[Received\\Angle
[AOA
[Antenna\\array
]
]
]
]
[Scene\\Analysis
]
[Lateration
[Propagation\\time, just=Variable
[TOA
[RF or\\ultrasonic, just=Device
]
]
[TDOA
[RF or\\Ultrasonic
]
]
]
[Signal\\Strength
[RSS, just=Ranging
[RF
]
]
]
]
]
\end{justtree}
\end{document}