Como pular nós intermediários na árvore Latex?

Como pular nós intermediários na árvore Latex?

Eu tenho o seguinte código LaTeX para uma linha do tempo (usando tree), mas gostaria que as duas caixas vazias após a caixa "não" desaparecessem e, em vez disso, tivessem apenas uma seta reta para action3 - algo assim:

yes -> action1 -> action2 -> action3
no  -----------------------> action3

Aqui está o código:

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees,arrows}

\begin{document}

\begin{tikzpicture}[level distance=1in,sibling distance=.25in,scale=.65]
\tikzset{edge from parent/.style=
        {thick, draw, -latex,
            edge from parent fork right},
            every tree node/.style={draw,minimum width=0.7in,text width=0.7in, align=center},grow'=right}
\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [. {no }
               [. {}
                 [. {}
                   [. {action3}
                   ]
                 ]
                ]
            ]
    ]

\end{tikzpicture}
\end{document}

Responder1

Com tikz-qtree, você pode remover bordas usando \edge[draw=none];e posteriormente conectar o no-node e o action3-node com \draw.

\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [.\node(no){no}; \edge[draw=none];
               [ \edge[draw=none];
                 [ \edge[draw=none];
                   [.\node(a3){action3};
                   ]
                 ]
                ]
            ]
    ]
\draw[-latex] (no)--(a3);

insira a descrição da imagem aqui

Responder2

Obrigado, ambos. Aqui está a solução que encontrei depois de postar a pergunta: (Observe que o código também move o sim e o não para acima das setas) (Observe também o comando \edge[-] para evitar as pontas intermediárias adicionais das setas)

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees,arrows}

\begin{document}

\begin{tikzpicture}[level distance=1.5in,sibling distance=.25in,scale=.65]
\tikzset{edge from parent/.style={thick, draw, -latex, edge from parent fork right},
     every tree node/.style={draw,minimum width=0.7in,minimum height=0.65in,text width=0.7in, align=center},grow'=right}
\Tree
[. \node {do?};
    \edge node[above, pos=0.7] {yes};
    [. {action1}
        [. {action2}
            [. {action3} ]
        ]
    ]
    \edge[-] node[below, pos=0.6] {no};
    [
     \edge[-] {};
        [
         \edge {};
            [. {action3} ]
        ]
     ]
]
\end{tikzpicture}

\end{document} 

Aqui está o que parece:insira a descrição da imagem aqui

Responder3

Comentando . {}duas vezes:

\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [. {no }
               [ %. {}
                 [ %. {}
                   [. {action3}
                   ]
                 ]
                ]
            ]
    ]

você obtém:

captura de tela da saída

Isso deve ser melhorado removendo as duas pontas das setas (e acho que isso exigiria algumas mudanças mais profundas no código).

Responder4

Uma vantagem deflorestaé que você pode usar tierpara informar ao pacote que determinados nós devem estar no mesmo nível da árvore, mesmo que alguns tenham mais nós intermediários do que outros.

Por exemplo, no código abaixo

    if n children=0{tier=terminums}{},

diz que todos os nós terminais devem ser colocados na mesma camada da árvore. Portanto, os nós de 2 ações 3 podem ser colocados sem a necessidade de criar nós fictícios para aquele com menos ancestrais.

Um estilo label me={}{}é criado para posicionamento conveniente dos rótulos yese nonas bordas. O primeiro argumento é adicionado às opções do nó rótulo e pode ser usado para especificar uma posição relativa, por exemplo, above rightou uma âncora, por exemplo, anchor=north westou qualquer outra coisa. O segundo argumento fornece o conteúdo do rótulo.

A grande vantagem do pacote é que, depois de configurar um estilo, você pode especificar árvores de forma muito concisa. Por exemplo:

  [do?
    [action 1, label me={above, anchor=south west}{yes}
      [action 2
        [action 3]
      ]
    ]
    [action 3, label me={below, anchor=north west}{no}]
  ]

produz

cadeias de ação

Código completo:

\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
  label me/.style n args=2{
    delay={edge label/.wrap value={node [midway, #1, font=\scriptsize] {#2}}}
  },
  for tree={
    grow'=0,
    draw,
    text width=15mm,
    minimum height=7mm,
    parent anchor=east,
    child anchor=west,
    edge={->},
    text centered,
    edge path={
      \noexpand\path [\forestoption{edge}] (!u.parent anchor) -- +(3mm,0) |- (.child anchor)\forestoption{edge label};
    },
    if n children=0{tier=terminums}{},
    l sep+=5mm,
  }
  [do?
    [action 1, label me={above, anchor=south west}{yes}
      [action 2
        [action 3]
      ]
    ]
    [action 3, label me={below, anchor=north west}{no}]
  ]
\end{forest}
\end{document}

informação relacionada