Как я могу изменить размер узлов, чтобы добавить в них текст. Ниже приведен код, а вторая диаграмма сгенерирована из этого кода.
\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
настройки по умолчанию. Сделайте это в локальной области TeX, если не хотите, чтобы они применялись к каждому forest
дереву в документе.
\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}