Указание узлов на горизонтальных линиях - PullRequest
0 голосов
/ 22 марта 2019

Я пытался несколько нарисовать график, представляющий последовательные состояния по прямой линии, S0 -> S1 -> S2.Затем действия в другой прямой линии ниже.Между S0 -> A0 -> S1 -> A1 -> S2 есть ребра.Которые образуют треугольники, выстроенные рядом друг с другом.
desired output with states and actions on horizontal lines

Я попытался использовать кластер, и rank = same для узлов, которые я хочу выровнять.Я также попытался использовать [constraint = false] и другие ответы о переполнении стека.

\begin{dot2tex}[fdp]
digraph G {
    newrank=true;
    node[group="states"]
    S0 [texlbl="$S_{t-2}$", shape=none];
    S1 [texlbl="$S_{t-1}$", shape=none];
    S2 [texlbl="$S_t$", shape=none];
    S3 [texlbl="$S_{t+1}$", shape=none];
    node[group=""]
    A0 [texlbl="$A_{t-2}$", shape=none];
    A1 [texlbl="$A_{t-1}$", shape=none];
    A2 [texlbl="$A_t$", shape=none];
    { rank=same; S0; S1; S2; S3;
    S0 -> S1-> S2 -> S3;
    S0 -> A0;
    S1 -> A1;
    S2 -> A2; }
    A0 -> S1;
    A1 -> S2;
    A2 -> S3;
}
\end{dot2tex}

Однако выходные данные графика представляют собой смесь состояний и действий на кривой.output showing curved graph

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Ваш код выглядит как часть документа LaTeX, но он не будет работать для меня;Насколько я понимаю, dot2tex - это скрипт Python, который генерирует код LaTeX.Но я здесь не в своей тарелке, похоже, это работает для вас.

Что я сделал - я исправил вашу ошибку, поставив закрывающую скобку } для инструкции rank = sameобратно в ту же строчку и вытащил ее из кажущейся среды LaTeX;Я также изменил направление стрелки для краев, показывающих «вверх».Затем я закомментировал ненужные инструкции, получив:

digraph G {
#    newrank=true;
#    node[group="states"]
    S0 [texlbl="$S_{t-2}$", shape=none];
    S1 [texlbl="$S_{t-1}$", shape=none];
    S2 [texlbl="$S_t$", shape=none];
    S3 [texlbl="$S_{t+1}$", shape=none];
#    node[group=""]
    A0 [texlbl="$A_{t-2}$", shape=none];
    A1 [texlbl="$A_{t-1}$", shape=none];
    A2 [texlbl="$A_t$", shape=none];
    { rank=same; S0; S1; S2; S3; }
    S0 -> S1-> S2 -> S3;
    S0 -> A0;
    S1 -> A1;
    S2 -> A2;
    edge[ dir = back ];
    S1 -> A0;
    S2 -> A1;
    S3 -> A2;
}

Преобразование этого в документ LaTex с помощью

dot2tex -ftikz x > x.tex

Я получаю

enter image description here

я думаю, это то, что вы хотите, или, по крайней мере, то, что будет генерировать ваш код.Ваш рабочий процесс может быть другим, но если вы исправите основную ошибку и переместите закрывающую скобку туда, где она должна быть, вам следует это сделать.Обратите внимание, что dot2tex использует движок dot по умолчанию, что вам и следует делать, как справедливо указано @ Dany.

Если вы хотите что-то, что близко к картинке в вашем посте,попробуйте

digraph G 
{
    node[ shape =none ]

    S  [ label = "" ];
    S0 [ texlbl="$S_{t-2}$" ];
    S1 [ texlbl="$S_{t-1}$" ];
    S2 [ texlbl="$S_t$" ];
    S3 [ texlbl="$S_{t+1}$" ];

    A0 [ texlbl="$A_{t-2}$" ];
    A1 [ texlbl="$A_{t-1}$" ];
    A2 [ texlbl="$A_t$" ];

    { rank=same; S S0 S1 S2 S3 }
    S0 -> S1 -> S2 -> S3

    S0 -> A1;
    S1 -> A2;
    edge[ dir = back ];
    S0 -> A0;
    S1 -> A1;
    S2 -> A2;

    edge[ style = invis ];
    S -> S1
    S -> A0;
}

enter image description here

1 голос
/ 23 марта 2019

Похоже, что вы используете механизм разметки fdp.

В соответствии с документацией ,

fdp рисует неориентированные графики с помощью модели '' spring '',Он основан на силовом подходе в духе Фрухтермана и Рейнгольда

В вашем случае вам нужно использовать dot движок макета.

Я незнакомы с программой, которую вы используете, но диким предположением будет заменить \begin{dot2tex}[fdp] на \begin{dot2tex}[dot]

...