2016-10-04 44 views
1

這裏節點高度一致就是我獲得通過使用MATLAB的treeplot功能(這是示例圖像):MATLAB的treeplot:從頂部

enter image description here

這是我想獲得什麼:

enter image description here

正如你可以看到,我想有根據從根的距離的每個節點的位置。那可能嗎?

+0

你究竟想要什麼?沒有標籤的情節?或者每個節點的'[x,y]'位置? – hbaderts

+0

我想要所有與根等距的節點位於同一水平線上。正如我寫的,標籤不相關。 – Paul

回答

1

我還在Matlab中尋找「根對齊」的樹形圖,發現沒有解決方案。以下是我想出了,萬一有人仍然需要它(我使用的是相同的例子如Matlab documentation):

nodes = [0 1 2 2 4 4 4 1 8 8 10 10]; 

首先,我們需要得到x和y座標在原樹情節的每一個節點,並找到所有的樹葉在它:

[x,y] = treelayout(nodes); 
leaves = find(y == min(y)); 

接下來,我們重構每個鏈樹情節和它(存儲在一個矩陣通過這樣做,我們以後可以改變的y位置節點):

num_layers = 1/min(y)-1; 
chains = zeros(num_layers, length(leaves)); 
for l=1:length(leaves) 
    index = leaves(l); 
    chain = []; 
    chain(1) = index; 
    parent_index = nodes(index); 
    j = 2; 
    while (parent_index ~= 0) 
     chain(j) = parent_index; 
     parent_index = nodes(parent_index); 
     j = j+1; 
    end 
    chains(:,l) = padarray(flip(chain), [0, num_layers-length(chain)], 'post'); 
end 

現在我們計算由矩陣的行索引和依賴層的樹的數量確定的新y座標:

y_new = zeros(size(y)); 
for i=1:length(nodes) 
    [r,c] = find(chains==i, 1); 
    y_new(i) = max(y) - (r-1)*1/(num_layers+1); 
end 

現在,我們可以畫出重新定位節點,並添加連接線:

plot(x, y_new, 'o'); 
hold on 
for c=1:size(chains, 2) 
    line_x = x(chains(chains(:,c)>0, c)); 
    line_y = y_new(chains(chains(:,c)>0, c)); 
    line(line_x, line_y); 
end 

如果你願意,你也可以在節點標籤添加到情節:

for t=1:length(nodes) 
    text(x(t)+0.025, y_new(t), num2str(t)); 
end 
xlim([0 1]); 
ylim([0 1]); 

由此得出的數字如下所示: root-aligned treeplot