如何在gnuplot中绘制树图

时间:2017-03-01 14:43:34

标签: gnuplot

我正在尝试在gnuplot中创建一个像图形的树,到目前为止,我有一些点,标签排列在树状结构中。我想连接节点(点),因此每个节点将连接到更高级别的节点。

gnuplot code:
set term png

set output "tree.png"
set xrange [0:50]
set yrange [0:50]



plot 'data.txt' using 1:2:3 with points  pointtype 7 lt 1 title 'title', \
     '' using 1:2:3 with labels offset 0,char 1

data:

20 35 1 
15 30 1.1
10 25 1.1.1
5 20 1.1.1.1
15 20 1.1.1.2

25 30 1.2
30 25 1.2.1
25 20 1.2.1.1
35 20 1.2.1.2

谢谢

enter image description here

1 个答案:

答案 0 :(得分:2)

这很可能需要在外部处理输入数据文件,以便即时生成边缘列表。

如果我正确理解了你的问题,你输入中的每个节点(点)都与一个"树路径"它只是一串点分隔的整数,表示图形(树)每个级别上的点的位置。现在,如果B的路径比路径A长1(1个额外的级别),并且A的路径是B的路径的前缀(A是B的父级),则应该连接两个节点A和B.

要做到这一点,可以假设输入上的点已经按照示例中的层次排序(即父节点的坐标在其任何子节点之前定义)并按如下方式继续:

set term png

set output "tree.png"
set xrange [0:50]
set yrange [0:50]

fName = 'data.txt'

parseEdges = sprintf('< gawk '' \
    NF==3{ \
        coords = $1 " " $2; \
        data[$3] = coords; \
        n = split($3, path, "."); \
        if(n == 1) next; \
        prefix=path[1]; \
        for(i=2;i<n;i++){ prefix = prefix "." path[i] } \
        if(prefix in data){ \
            print data[prefix] "\n" coords "\n"; \
        } \
    } \
'' %s', fName);

plot \
    fName using 1:2:3 with points  pointtype 7 lt 1 title 'title', \
    '' using 1:2:3 with labels offset 0,char 1, \
    parseEdges w l

这里,gawk脚本在第三列中拆分路径规范,提取其前缀(通过剥离路径的最不重要部分),最后检查此前缀的坐标(父路径)是否已经可用,如果是,则打印一个坐标块,然后在最终输出中显示为连接边。结果是:

enter image description here