Стрелка к стрелке и более короткие (?) стрелки

Стрелка к стрелке и более короткие (?) стрелки

Я потратил много времени, пытаясь создать красивое графическое представление гипотез, но, похоже, у меня ничего не получается. Основная проблема в том, что я не вижу, как сделать так, чтобы стрелка (подпись H8) указывала из узла H в середину стрелки между F и G. Я также хочу, чтобы другая стрелка (подпись H9) указывала из узла I в только что созданную стрелку, указывающую из H в стрелку между F и G. Другая проблема в том, что, по-моему, стрелки выглядят немного странно (должны ли они быть короче и не «касаться» узлов?). Вот как это выглядит сейчас:

введите описание изображения здесь

А это мой текущий код без этих двух стрелок:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{positioning}
 \tikzset{main node/.style={rectangle,fill=white!5,draw,minimum size=1cm,inner sep=4pt},
            }


\begin{document} \centering \begin{tikzpicture}

    \node[main node] (A) at (0,3) {Situation};
    \node[main node] (B) at (3,1) {Gratitude};
    \node[main node] (C) at (3,3) {Guilt};
    \node[main node] (D) at (3,5) {Anger};
    \node[main node] (F) at (6,3) {State};
    \node[main node] (G) at (9,3) {Actions};
    \node[main node] (H) at (7.5,0) {Higher order beliefs};
    \node[main node] (I) at (9,1.5) {Time pressure};
\draw [->] (A) -- node[below] {H3} (B); 

\draw [->] (A) -- node[below] {H2} (C);

\draw [->] (A) -- node[above] {H1} (D);

\draw [->] (B) -- node[below] {H6} (F);

\draw [->] (C) -- node[below] {H5} (F);

\draw [->] (D) -- node[above] {H4} (F);

\draw [->] (F) -- node[above] {H7} (G);
\end{tikzpicture}
\end{document}

Заранее спасибо за вашу помощь!

решение1

Вы можете определить точки между узлами следующим образом:

\draw [->] (F) -- coordinate[pos=0.2] (fg) (G);

Это определяет координату, названную fgмежду Fи G; pos=0означает в F, pos=1означает в G, и pos=0.2является позицией, довольно близкой к F. Пропуск опции будет таким же, как pos=0.5, т. е. координата будет размещена посередине между двумя узлами.

Вы можете указать позиции, которые находятся выше/ниже/слева/справа от других узлов, используя -|и |-. Положение (A-|B)находится горизонтально слева/справа Aи вертикально выше/ниже B.

Укорачивание стрелок можно осуществить с помощью опций shorten <=2pt(укорачивает начало стрелок на 2pt) и shorten >=2pt(укорачивает конец стрелок на 2pt). Добавление его к tikzpictureвлияет на все строки, добавление его к опциям команды \drawвлияет только на определенные строки.

введите описание изображения здесь

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset
  {main node/.style=
    {rectangle,fill=white!5,draw,minimum size=1cm,inner sep=4pt}
  }
\begin{document}
\begin{tikzpicture}%
  [shorten <=2pt,shorten >=2pt,>=stealth]
  \node[main node] (A) at (0,3) {Situation};
  \node[main node] (B) at (3,1) {Gratitude};
  \node[main node] (C) at (3,3) {Guilt};
  \node[main node] (D) at (3,5) {Anger};
  \node[main node] (F) at (6,3) {State};
  \node[main node] (G) at (9,3) {Actions};
  \node[main node] (H) at (7.5,0) {Higher order beliefs};
  \node[main node] (I) at (9,1.5) {Time pressure};
  \draw [->] (A) -- node[below] {H3} (B); 
  \draw [->] (A) -- node[below] {H2} (C);
  \draw [->] (A) -- node[above] {H1} (D);
  \draw [->] (B) -- node[below] {H6} (F);
  \draw [->] (C) -- node[below] {H5} (F);
  \draw [->] (D) -- node[above] {H4} (F);
  \draw [->] (F) -- node[above] {H7} coordinate[pos=0.2] (fg) (G);
  \draw [<-] (fg) --node[left] {H8} coordinate (fgH) (fg|-H.north);
  \draw [->] (I.west) -- node[above] {H9} (I.west-|fgH); 
\end{tikzpicture}
\end{document}

РедактироватьПо поводу вопроса в комментариях: существует несколько способов позиционирования краевых меток.

Вы можете добавить расстояние до aboveи belowт.д.

\draw [->] (A) -- node[below=3mm] {H2} (C);

Для перемещения узла можно использовать xshiftи/или :yshift

\draw [->] (C) -- node[below,xshift=-5mm] {H5} (F);

Вы можете изменить внутреннее или внешнее разделение — это дополнительное пространство вокруг границы узла.

\draw [->] (A) -- node[below,outer sep=2pt] {H3} (B); 
\draw [->] (A) -- node[above,inner sep=7pt] {H1} (D);

Вы можете поместить узел без содержимого прямо на линию и добавить содержимое в качестве метки.к узлу.

\draw [->] (D) -- node[label=H4] {} (F);
\draw [->] (D) -- node[label=90:H4] {} (F);
\draw [->] (B) -- node[label={[label distance=1cm]-90:H6}] {} (F);

Первые две строки эквивалентны: Если направление не указано, то значение по умолчанию выше, т. е. 90 градусов. Кроме того, расстояние между метками может быть указано как опция. Обратите внимание, что вам понадобятся дополнительные скобки, если значение опции labelсодержит квадратные скобки, запятые или знаки равенства.

В примере ниже я добавил drawвозможность отображения границы и положения узлов.

введите описание изображения здесь

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset
  {main node/.style=
    {rectangle,fill=white!5,draw,minimum size=1cm,inner sep=4pt}
  }
\begin{document}
\begin{tikzpicture}%
  [shorten <=2pt,shorten >=2pt,>=stealth]
  \node[main node] (A) at (0,3) {Situation};
  \node[main node] (B) at (3,1) {Gratitude};
  \node[main node] (C) at (3,3) {Guilt};
  \node[main node] (D) at (3,5) {Anger};
  \node[main node] (F) at (6,3) {State};
  \draw [->] (A) -- node[below,outer sep=2pt,draw] {H3} (B); 
  \draw [->] (A) -- node[below=3mm,draw] {H2} (C);
  \draw [->] (A) -- node[above,inner sep=7pt,draw] {H1} (D);
  \draw [->] (B) -- node[label={[label distance=1cm]-90:H6},draw] {} (F);
  \draw [->] (C) -- node[below,xshift=-5mm,draw] {H5} (F);
  \draw [->] (D) -- node[label=H4,draw] {} (F);
\end{tikzpicture}
\end{document}

решение2

Быстрый способ сделать существующие стрелки короче — добавить несколько стрелок outer sepк main nodes.

Для отсутствующих стрелок можно дать имя узлу, который находится посередине стрелки, и использовать его в качестве отправной точки.

введите описание изображения здесь

\documentclass{article}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
   main node/.style={rectangle,fill=white!5,draw,minimum size=1cm,inner sep=4pt,outer sep=2pt}
   }
\begin{document}
\centering
\begin{tikzpicture}

    \node[main node] (A) at (0,3) {Situation};
    \node[main node] (B) at (3,1) {Gratitude};
    \node[main node] (C) at (3,3) {Guilt};
    \node[main node] (D) at (3,5) {Anger};
    \node[main node] (F) at (6,3) {State};
    \node[main node] (G) at (9,3) {Actions};
    \node[main node] (H) at (7.5,0) {Higher order beliefs};
    \node[main node] (I) at (9,1.5) {Time pressure};

\draw [->] (A) -- node[below] {H3} (B); 
\draw [->] (A) -- node[below] {H2} (C);
\draw [->] (A) -- node[above] {H1} (D);
\draw [->] (B) -- node[below] {H6} (F);
\draw [->] (C) -- node[below] {H5} (F);
\draw [->] (D) -- node[above] {H4} (F);
\draw [->] (F) -- node[above] (FG) {H7} (G);

\draw [->,shorten >=2pt] (H) to[bend left] node[left] (FGH) {H8} (FG);
\draw [->] (I) -- node[above] {H9} (FGH);
\end{tikzpicture}
\end{document}

решение3

На основе ответа *Torbjørn T.$, но с использованием quotesпакета для маркировки ребер, пакета positioningдля позиционирования узлов и с некоторыми усилиями по сокращению кода:

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{positioning, quotes}

\begin{document}
    \centering
\begin{tikzpicture}[auto,
    node distance = 6mm and 15 mm,
 main node/.style = {rectangle, draw, minimum size=1cm,
                     inner sep=4pt, outer sep=2pt}
                    ]
    \begin{scope}[every node/.style={main node}]
\node  (A) {Situation};
\node[right=of A]   (C) {Guilt};
\node[below=of C]   (B) {Gratitude};
\node[above=of C]   (D) {Anger};
\node[right=of C]   (F) {State};
\node[right=of F]   (G) {Actions};
\node[below=of G]   (I) {Time pressure};
\node[below=of I.south west]    (H) {Higher order beliefs};
    \end{scope}
\draw[->]   (A) edge ["H3" '] (B) 
            (A) edge ["H2"] (C) 
            (A) edge ["H1"] (D) 
            (B) edge ["H6"'] (F) 
            (C) edge ["H5"] (F) 
            (D) edge ["H4"] (F) 
            (F) edge node[above] (FG) {H7} (G);
\draw [->,shorten >=2pt] 
            (H) edge [bend left] node[left] (FGH) {H8} (FG)
            (I)  to ["H9" '] (FGH.east |- I);
\end{tikzpicture}
\end{document}

введите описание изображения здесь

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