Seta a seta e setas mais curtas (?)

Seta a seta e setas mais curtas (?)

Tenho passado muito tempo tentando gerar uma representação gráfica de hipóteses bonita, mas não consigo acertar. O principal problema é que não vejo como deixar uma seta (legenda H8) aponte do nó H para o meio da seta entre F e G. Também quero que outra seta (legenda H9) aponte do nó I para a seta recém-criada, aponte de H para a seta entre F e G. Outro problema é que Eu acho que as setas parecem um pouco estranhas (elas deveriam ser mais curtas e não 'tocar' os nós?). Isto é o que parece agora:

insira a descrição da imagem aqui

E este é o meu código atual sem essas duas setas:

\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}

Agradeço antecipadamente por sua ajuda!

Responder1

Você pode definir pontos entre nós assim:

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

Isto define uma coordenada nomeada fgentre Fe G; pos=0significa em F, pos=1significa em Ge pos=0.2é uma posição bastante próxima de F. Omitir a opção é o mesmo que pos=0.5, ou seja, a coordenada seria colocada a meio caminho entre os dois nós.

Você pode especificar posições acima/abaixo/esquerda/direita de outros nós usando -|e |-. A posição (A-|B)é horizontalmente à esquerda/direita Ae verticalmente acima/abaixo de B.

O encurtamento das setas pode ser conseguido com as opções shorten <=2pt(encurta o início das setas em 2 pontos) e shorten >=2pt(encurta o final das setas em 2 pontos). Adicioná-lo tikzpictureafeta todas as linhas, adicioná-lo às opções de um \drawcomando afeta apenas linhas específicas.

insira a descrição da imagem aqui

\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}

EditarEm relação à pergunta nos comentários: Existem vários métodos para posicionar rótulos de borda.

Você pode adicionar uma distância a above, belowetc.

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

Você pode usar xshifte/ou yshiftpara mover o nó:

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

Você pode alterar a separação interna ou externa, este é o espaço extra ao redor da borda do nó.

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

Você pode colocar o nó sem conteúdo diretamente na linha e adicionar o conteúdo como um rótulopara o nó.

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

As duas primeiras linhas são equivalentes: Se nenhuma direção for dada, o padrão será acima, ou seja, 90 graus. Além disso, a distância da etiqueta pode ser especificada como opção. Observe que você precisará de colchetes extras se o valor da opção labelcontiver colchetes, vírgulas ou sinais de igualdade.

No exemplo abaixo adicionei a drawopção de mostrar a borda e a posição dos nós.

insira a descrição da imagem aqui

\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}

Responder2

Um método rápido para diminuir as setas existentes é adicionar algumas outer sepao main nodes.

Para as setas ausentes, você pode dar um nome ao nó que está no meio da seta e usá-lo como ponto de partida.

insira a descrição da imagem aqui

\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}

Responder3

Baseado na resposta *Torbjørn T.$, mas com uso de quotespacote para rotulagem de bordas, pacote positioningpara posicionamento de nós e com algum esforço para tornar o código mais curto:

\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}

insira a descrição da imagem aqui

informação relacionada