2016-07-01 23 views
1

Ich habe eine obere dreieckige angrenzende Matrix, die eine Menge von Knoten darstellt, die verbunden sind. Jeder Knoten wird durch drei geographische Koordinaten definiert: x y z. Mein Ziel ist es, das Netzwerk zu plotten, um zu sehen, wie es aussieht, indem ich auch die Richtung der Kanten berücksichtige.Wie 3d gerichteter Graph in Matlab geplottet wird

Wenn ich berücksichtigen nicht die z-Koordinate, ich bin in der Lage das Ergebnis leicht anzuzeigen:

enter image description here

die Codezeilen, um dieses Ergebnis zu bekommen sind:

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]) 

Wie soll ich meinen Code ändern, um dem Diagramm auch die z-Koordinaten zuzuordnen, damit ich ein 3D-Diagramm haben kann? (Denken Sie daran, dass ich auch die Kantenrichtung anzeigen möchte!).

Was ich versucht ist, dies zu tun:

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

aber ich hatte keinen Erfolg.

+0

Ich denke, Sie haben eine benutzerdefinierte 'plot3' Methode zu schreiben. Schauen Sie sich die Implementierung von 'plot' für' digraph' an ('edit @ digraph/plot'), vielleicht finden Sie etwas Nützliches. – Vahid

+0

hat meine Antwort Ihr Problem gelöst? – shamalaia

+0

@shamalaia Ihre Antwort ist ziemlich hilfreich; Ich warte immer noch auf weitere mögliche Antworten und in dem Fall, dass niemand andere Optionen gibt, werde ich Ihre als die richtige bestätigen ... wissen Sie, wie man die Pfeilspitze in der Mitte der roten Segmente setzt? –

Antwort

0

In der neuesten MATLAB Mitteilung (R2016b), ist es nun möglich, Zeichnen Sie einen Knoten-Link-Graphen in 3d, indem Sie eine andere Layout-Methode wählen oder die x-, y- und z-Koordinaten direkt angeben. In Ihrem Beispiel, ersetzen Sie das Plotten Linie durch

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

Resultierende Grundstück:

A 3-dimensional plot of the graph data

2

Kühles Problem. Ich hatte etwas Zeit und produziert diese:

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 

Dass ich denke, so ziemlich aussieht wie das, was Sie wollen:

EDIT

Wenn Sie auf den Pfeil Kopf wollen in der Mitte der zwei Knoten, die Sie verwenden können:

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); 

Dies zieht eine Linie ersten und den einen Pfeil superimpose, die den Mittelpunkt (man beachte den 0.5 Skalierungsfaktor im quiver Befehl) erreicht: