标签 graphviz 下的文章

一、问题描述

画二叉树的时候,总是无法对齐圆点得到对称的节点。例如:

graph test {
    graph [dpi=80]
    node [shape=circle];

    1 -- 2, 3;
    2 -- 4, 5 [color=red,penwidth=3.0];

    3 -- 6, 7 [color=red,penwidth=3.0];
    4 -- 8;
}

画出来的效果:

红色标出来的4个线条,长度不一样,子节点看起来不对称,就导致整个二叉树看起来也不够美观。

二、解决方案

可以在子节点中加一个中间节点,把线条的weight设置成10,然后隐藏中间的节点和连线:

graph bin_tree {
    node [shape=circle];

    1 -- 2, 3;
    2 -- 4;
    // 隐藏中间节点的连线
    2 -- m2 [weight=10 style="dashed"];
    2 -- 5;

    3 -- 6;
    // 隐藏中间节点的连线
    3 -- m3 [weight=10 style="dashed"];
    3 -- 7;
    4 -- 8;
        
        // 隐藏中间节点
    m2, m3 [label="" style="dashed"]
}

效果:

weight属性的作用是设置线条的权重,权重越大,线条越垂直。

如果希望完全隐藏中间节点,只要把对应节点和线条的属性设置为invis即可:

style="dashed" -> style="invis"

三、参考

Enforcing horizontal node ordering in a .dot tree

How to get balanced diagrams from graphviz?

默认情况下的,通过dot命令导出的图片分辨率很低。在高分辨率的显示器下看,图片很小,放大了也很模糊。修改分辨率的办法:

digrapvh G {
    graph [dpi=300]
}

修改后的效果:

修改前的效果:

也可以在导出的时候使用-G参数来控制:

dot -T png -Gdpi=300 -o demo.png demo.dot

参考

how-do-i-set-the-resolution-when-converting-dot-files-graphviz-to-images

一、数组

digraph demo {
    n [label="{1|2|3}" shape=record]
}

效果:

如果希望数组横过来,要设置全局的rankdir属性:

digraph demo {
    rankdir=LR
    n [label="{1|2|3}" shape=record]
}

效果:

二、链表节点

digraph demo {
    rankdir=LR
    n1 [label="{<data>data|<next>}" shape=record]
    n2 [label="{<data>data|<next>}" shape=record]
    n3 [label="{<data>data|<next>nil}" shape=record]

    n1:next:0 -> n2:data [tailclip=false]
    n2:next:0 -> n3:data [tailclip=false]
}

效果:

一、subgraph语法

子图的使用方法:

subgraph cluster* {
    // xxxx    
}

子图的语法和其他语法也是一样的,一个千万要注意的地方是子图的命名必须以cluster开头。

例如:

digraph {
    subgraph cluster_0 {
        label="Subgraph A";
        a -> c;
        b -> c;
    }

    subgraph cluster_1 {
        label="Subgraph B";
        a -> f;
        f -> c;
    }
}

效果:

二、把箭头指向容器的办法

如果希望把箭头容器,而不是指向容器内部元素的话,需要使用以下两个属性:

compound=true;
// a和b分别表示箭头的头部和尾部
xx -> yy [lhead=a ltail=b]

要注意的是compound=true属性一定需要,它是全局代码段的。

例如修改上图中的a到f的线条为a到子容器B

digraph demo {
    compound=true;
    subgraph cluster_0 {
        label="Subgraph A";
        a -> c;
    }

    subgraph cluster_1 {
        label="Subgraph B";
        f -> c;
    }

    a -> f [lhead=cluster_1];
}

效果:

一、基本用法

画一个简单的二叉树:

digraph bin_tree {
    1->2;
    1->3;
}

图形:

二、设置形状

上面的1/2/3都是一个node,通常被称为节点,默认情况下节点是圆形的。可以通过shape属性来设置节点形状。

设置形状为长方形:

digraph bin_tree {
    node [shape="rectangle"];
    1->2;
    1->3;
}

设置形状为三角形:

digraph bin_tree {
    node [shape="triangle"];
    1->2;
    1->3;
}

graphviz提供了很多形状可以选择,具体的类型和样式可在Node Shapes找到。

三、设置线条

3.1 设置虚线

设置线条的属性要修改edge属性,线条不只是箭头,每个node的边也被edge属性控制。

例如设置节点的线条为虚线:

digraph bin_tree {
    node [shape="rectangle" style="dashed"];
    1->2;
    1->3;
}

dash-node

设置箭头的线条为虚线:

digraph bin_tree {
    node [shape="rectangle" style="dashed"];
    edge [style="dashed"];
    1->2;
    1->3;
}

3.2 设置箭头形状

当然,箭头的形状也是可以设置的,例如设置成不要箭头:

digraph bin_tree {
    node [shape="circle"];
    edge [arrowhead="none"];
    1->2;
    1->3 ;
}

箭头的形状可以在Arrow Shapes找到,还有很多线条的形状可以设置。

四、设置颜色

设置线条颜色为红色,节点填充色为灰色:

digraph bin_tree {
    node [shape="rectangle" style="dashed,filled" color="gray"];
    edge [style="dashed" color="red"];
    1->2;
    1->3;
}

对node/edge的属性配置是全局生效的,局部生效的方法:

digraph bin_tree {
    node [shape="rectangle" style="dashed,filled" color="gray"];
    edge [style="dashed" color="red"];
    1->2;
    1->3 [color="blue"];
}

设置rgb颜色

edge [style="dashed" color="#ff00ff"];