如何在matlab中绘制三维有向图

时间:2016-07-01 07:17:48

标签: matlab plot graph 3d adjacency-matrix

我有一个上三角形相邻矩阵,它代表一组连接的节点。每个节点由三个地理坐标定义:x y z。 我的目标是绘制网络,以便通过考虑边缘的方向来查看它的外观。

如果我不考虑z坐标,我可以轻松地显示结果:

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

我应该如何修改我的代码以便为图形分配z坐标,这样我就可以得到一个3d图形? (记得我也想显示边缘方向!!)。

我试图做的是:

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

但我没有成功。

2 个答案:

答案 0 :(得分:3)

很酷的问题。我有一些空余时间并制作了这个:

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

我认为看起来非常像你想要的那样:

修改

如果您希望箭头位于两个节点的中点,您可以使用:

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

首先绘制一条线,然后叠加一条到达中点的箭头(注意0.5命令中的quiver比例因子):

答案 1 :(得分:1)

在最新的MATLAB版本(R2016b)中,现在可以通过选择不同的布局方法或直接指定x,y和z坐标来绘制3d中的节点链接图。在您的示例中,请用

替换绘图线
p = plot(F,'XData',xyz(:,2),'YData',xyz(:,1),'ZData',xyz(:,3));

结果情节:

A 3-dimensional plot of the graph data