我正在尝试在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
谢谢
答案 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脚本在第三列中拆分路径规范,提取其前缀(通过剥离路径的最不重要部分),最后检查此前缀的坐标(父路径)是否已经可用,如果是,则打印一个坐标块,然后在最终输出中显示为连接边。结果是: