Преамбула

Преамбула

Как я могу изменить размер узлов, чтобы добавить в них текст. Ниже приведен код, а вторая диаграмма сгенерирована из этого кода.

\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

Этот ответ демонстрирует две вещи:

  1. которыйлесрешение устраняет необходимость указывать расстояния между элементами вручную — дерево автоматически упаковывается для создания компактной и лаконичной формы;

  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}

Связанный контент