2017-03-01 48 views
1

我想在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

这很可能会需要从外部处理输入数据文件以产生对即时边缘的列表。

如果我正确理解您的问题,您输入中的每个节点(点)都与一个“树形路径”相关联,该树形路径只是一个点分隔的整数串,表示图的每个级别上点的位置(树)。现在,如果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

+0

非常感谢你:)它完美的作品 –