2017-03-01 91 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

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