使用Dot语言在Graphviz中压缩有向图

10
我想要实现一个特定图形的可视化(对称置换群的Cayley图),类似于这里所做的,但是使用Graphviz 2.28和Dot。

cayley
(来源:euclideanspace.com

digraph cayley {
    i -> x [color=red];
    i -> y [color=blue];
    x -> xx [color=red];
    x -> xy [color=blue];
    y -> yx [color=red];
    y -> yy [color=blue];
    xx -> xxx [color=red];
    xx -> xxy [color=blue];
    xy -> xyx [color=red];
    xy -> xyy [color=blue];
    yx -> yxx [color=red];
    yx -> xyx [color=blue];
    yy -> yyx [color=red];
    yy -> yyy [color=blue];
    xxx -> i [color=red];
    xxx -> xxxy [color=blue];
    xxy -> xxyx [color=red];
    xxy -> xxyy [color=blue];
    xyx -> xyxx [color=red];
    xyx -> xxyx [color=blue];
    xyy -> yy [color=red];
    xyy -> xyyy [color=blue];
    yxx -> yxxx [color=red];
    yxx -> xx [color=blue];
    yyx -> xxyy [color=red];
    yyx -> xyxx [color=blue];
    yyy -> yyyx [color=red];
    yyy -> i [color=blue];
    xxxy -> xxxyx [color=red];
    xxxy -> yyx [color=blue];
    xxyx -> yyy [color=red];
    xxyx -> xxxyx [color=blue];
    xxyy -> xyy [color=red];
    xxyy -> yxx [color=blue];
    xyxx -> xyxxx [color=red];
    xyxx -> xxx [color=blue];
    xyyy -> xyyyx [color=red];
    xyyy -> x [color=blue];
    yxxx -> y [color=red];
    yxxx -> xyyyx [color=blue];
    yyyx -> xxy [color=red];
    yyyx -> xyxxx [color=blue];
    xxxyx -> xyyy [color=red];
    xxxyx -> yx [color=blue];
    xyxxx -> xy [color=red];
    xyxxx -> yxxx [color=blue];
    xyyyx -> xxxy [color=red];
    xyyyx -> yyyx [color=blue];
}

我的Dot生成了以下布局:cayley,相比之前的那个布局,这是一个相当庞大的图形。是否有任何attribute可以将图形压缩到尽可能接近第一个图形?

... 我已经尝试了@doug提供的解决方案,但在这种情况下它不起作用。 - mihaipopescu
1个回答

31

我修改了图形、节点和边缘的默认属性,以尽可能地使布局紧凑。也许还有更完美的方法。顺便提一下,节点i位于左侧而不是右侧。

digraph cayley {
    graph[rankdir=LR, center=true, margin=0.2, nodesep=0.1, ranksep=0.3]
    node[shape=circle, fontname="Courier-Bold", fontsize=10, width=0.4, height=0.4, fixedsize=true]
    edge[arrowsize=0.6, arrowhead=vee]
    i -> x [color=red];
    i -> y [color=blue];
    x -> xx [color=red];
    x -> xy [color=blue];
    y -> yx [color=red];
    y -> yy [color=blue];
    xx -> xxx [color=red];
    xx -> xxy [color=blue];
    xy -> xyx [color=red];
    xy -> xyy [color=blue];
    yx -> yxx [color=red];
    yx -> xyx [color=blue];
    yy -> yyx [color=red];
    yy -> yyy [color=blue];
    xxx -> i [color=red];
    xxx -> xxxy [color=blue];
    xxy -> xxyx [color=red];
    xxy -> xxyy [color=blue];
    xyx -> xyxx [color=red];
    xyx -> xxyx [color=blue];
    xyy -> yy [color=red];
    xyy -> xyyy [color=blue];
    yxx -> yxxx [color=red];
    yxx -> xx [color=blue];
    yyx -> xxyy [color=red];
    yyx -> xyxx [color=blue];
    yyy -> yyyx [color=red];
    yyy -> i [color=blue];
    xxxy -> xxxyx [color=red];
    xxxy -> yyx [color=blue];
    xxyx -> yyy [color=red];
    xxyx -> xxxyx [color=blue];
    xxyy -> xyy [color=red];
    xxyy -> yxx [color=blue];
    xyxx -> xyxxx [color=red];
    xyxx -> xxx [color=blue];
    xyyy -> xyyyx [color=red];
    xyyy -> x [color=blue];
    yxxx -> y [color=red];
    yxxx -> xyyyx [color=blue];
    yyyx -> xxy [color=red];
    yyyx -> xyxxx [color=blue];
    xxxyx -> xyyy [color=red];
    xxxyx -> yx [color=blue];
    xyxxx -> xy [color=red];
    xyxxx -> yxxx [color=blue];
    xyyyx -> xxxy [color=red];
    xyyyx -> yyyx [color=blue];
    { rank=same; x; y }
    { rank=same; xx; xy; yx; yy }
    { rank=same; xxx; xxy; xyx; xyy; yxx; yyx; yyy }
    { rank=same; xxxy; xxyx; xxyy; xyxx; xyyy; yxxx; yyyx }
    { rank=same; xxxyx; xyxxx; xyyyx }
}
图片如下所示。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接