2016-07-01 12 views
1

私は接続されているノードのセットを表す上三角隣接行列を持っています。すべてのノードは、3つの地理座標x y zによって定義されます。 私の目標は、エッジの方向も考慮に入れて、ネットワークがどのように見えるかを見るためにネットワークをプロットすることです。私は、z座標を考慮していない場合はmatlabに3Dの有向グラフをプロットする方法

、私は簡単に結果を表示することができる午前:

enter image description here

この結果を得るために、コードの行は、次のとおりです。

A = [0 1 1 0 0 0 0; 
    0 0 1 1 0 0 0; 
    0 0 0 1 1 1 0; 
    0 0 0 0 1 1 0; 
    0 0 0 0 0 0 1; 
    0 0 0 0 0 0 1; 
    0 0 0 0 0 0 0]; 

xyz = [ 0 0 0; 
     -15 20 5; 
     17 24 -3; 
     -5 36 7; 
     -14 50 -8; 
     16 56 3; 
     3 70 -1]; 

F = digraph(A); 
figure 
p = plot(F,'XData',xyz(:,2),'YData',xyz(:,1)); axis equal; 
highlight(p,1,'NodeColor','g'); highlight(p,size(A,1),'NodeColor','r'); 
view([0 90]) 

私は3次元グラフを持つことができるようにグラフにz座標を代入するために私のコードをどのように修正すべきですか? (私はエッジ方向も表示したいと思います!!)。

私は何をしようとしたことはこれです:

p = plot3(F,'XData',xyz(:,2),'YData',xyz(:,1),'ZData',xyz(:,3)); 

が、私は何も成功していません。

+0

を、私はあなたがカスタム 'plot3'メソッドを記述する必要がありますね。 'digraph'(' edit @ digraph/plot')の 'plot'の実装を見てみると、何か役に立つと思うかもしれません。 – Vahid

+0

私の答えはあなたの問題を解決しましたか? – shamalaia

+0

@shamalaiaあなたの答えはかなり役に立ちます。私はまだ最終的な答えを待っているし、他の誰も他のオプションを与えていない場合は、私は正しいものとしてあなたのことを確認します... btw赤い線分の中央に矢印の頭を設定する方法を知っていますか? –

答えて

0

を、それができるようになりました別のレイアウト方法を選択するか、またはx、y、z座標を直接指定して、ノードリンクグラフを3Dでプロットします。あなたの例では、

p = plot(F,'XData',xyz(:,2),'YData',xyz(:,1),'ZData',xyz(:,3)); 

結果のプロットでプロットラインを置き換える:

A 3-dimensional plot of the graph data

2

クールな問題。私はいくつかの暇な時間を持っていたし、これを生産:

私はかなりあなたが望むように見えると思います
close all 

clear all 

A = [0 1 1 0 0 0 0; 
    0 0 1 1 0 0 0; 
    0 0 0 1 1 1 0; 
    0 0 0 0 1 1 0; 
    0 0 0 0 0 0 1; 
    0 0 0 0 0 0 1; 
    0 0 0 0 0 0 0]; 

xyz = [ 0 0 0; 
     -15 20 5; 
     17 24 -3; 
     -5 36 7; 
     -14 50 -8; 
     16 56 3; 
     3 70 -1]; 

    figure; hold on 

    for jj=1:size(A,1) %cycle on nodes 

     conn=find(A(jj,:)); %find connections for each node 

     if numel(conn>0) %if there are non null connections 
     for kk=1:numel(conn) %plot them 
      a=conn(kk);   

      lh=quiver3(xyz(jj,1),xyz(jj,2),xyz(jj,3),... 
      xyz(a,1)-xyz(jj,1),xyz(a,2)-xyz(jj,2),xyz(a,3)-xyz(jj,3),0,'maxheadsize',0.5); 

      set(lh,'linewidth',4); 
      set(lh,'color',[1,0,0]); 

     end 
     end 
    end 
    scatter3(xyz(:,1),xyz(:,2),xyz(:,3),800,'b','.') %plot nodes 


    %number the nodes 
    for ii=1:size(xyz,1) 
     text(xyz(ii,1),xyz(ii,2),xyz(ii,3),num2str(ii),'Color','k','FontWeight','bold',... 
    'FontSize',14, 'HorizontalAlignment','right', 'VerticalAlignment','bottom') 
    end 


    xlabel('x') 
    ylabel('y') 
    zlabel('z') 

    view(-15,18) 
    grid on 

EDIT

あなたに矢印の頭をしたい場合あなたが使用できる2つのノードの中間点にある:

line([xyz(a,1) xyz(jj,1)],[xyz(a,2) xyz(jj,2)],[xyz(a,3) xyz(jj,3)],'color',[1 0 0],'linewidth',3) 
      lh=quiver3(xyz(jj,1),xyz(jj,2),xyz(jj,3),... 
      xyz(a,1)-xyz(jj,1),xyz(a,2)-xyz(jj,2),xyz(a,3)-xyz(jj,3),.5,'maxheadsize',0.5); 

これは、最初の線を描画し、中間点(quiverコマンドで0.5スケーリング係数に注意してください)に達する矢印重ねる:最新のMATLABリリース(R2016b)では

関連する問題