在水平线上指定节点

时间:2019-03-22 20:43:58

标签: graphviz dot2tex

我尝试过几次绘制一个以连续状态S0-> S1-> S2表示连续状态的图形。然后在下面的另一条直线上动作。 S0-> A0-> S1-> A1-> S2之间有边。形成三角形并排排列的三角形。
desired output with states and actions on horizontal lines

我尝试使用群集,并且要对齐的节点的等级=相同。我也尝试在Stack Overflow上使用[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 个答案:

答案 0 :(得分:1)

似乎您正在使用fdp布局引擎。

根据documentation

  

fdp使用“弹簧”模型绘制无向图。它以弗鲁希特曼(Fruchterman)和莱因戈德(Reingold)的精神为基础,采用了以力为导向的方法

根据您的情况,您需要使用布局引擎。

我对您所使用的程序不熟悉,但是疯狂的猜测是将\begin{dot2tex}[fdp]替换为\begin{dot2tex}[dot]

答案 1 :(得分:1)

您的代码看起来像是LaTeX文档的一部分,但对我而言不起作用;据我所知,dot2tex是一个生成LaTeX代码的Python脚本。但是我不在这里,似乎对您有用。

我所做的-我纠正了您所犯的错误,将}指令的右括号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