Я потратил много времени, пытаясь создать красивое графическое представление гипотез, но, похоже, у меня ничего не получается. Основная проблема в том, что я не вижу, как сделать так, чтобы стрелка (подпись 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 node
s.
Для отсутствующих стрелок можно дать имя узлу, который находится посередине стрелки, и использовать его в качестве отправной точки.
\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}