如何在 matlab 中绘制 3d 有向图
How to plot 3d directed graph in matlab
我有一个上三角相邻矩阵,它表示一组相连的节点。每个节点都由三个地理坐标定义:x y z。
我的目标是绘制网络,以便通过考虑边缘的方向来查看它的外观。
如果我不考虑z坐标,我可以很容易地显示结果:
得到这个结果的代码行是:
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));
但是我没有成功。
很酷的问题。我有一些空闲时间制作了这个:
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);
这首先画一条线,然后叠加一个到达中点的箭头(注意quiver
命令中的0.5
比例因子):
在最新的 MATLAB 版本 (R2016b) 中,现在可以通过选择不同的布局方法或直接指定 x、y 和 z 坐标在 3d 中绘制节点-link 图形。在您的示例中,将绘图线替换为
p = plot(F,'XData',xyz(:,2),'YData',xyz(:,1),'ZData',xyz(:,3));
结果图:
我有一个上三角相邻矩阵,它表示一组相连的节点。每个节点都由三个地理坐标定义:x y z。 我的目标是绘制网络,以便通过考虑边缘的方向来查看它的外观。
如果我不考虑z坐标,我可以很容易地显示结果:
得到这个结果的代码行是:
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));
但是我没有成功。
很酷的问题。我有一些空闲时间制作了这个:
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);
这首先画一条线,然后叠加一个到达中点的箭头(注意quiver
命令中的0.5
比例因子):
在最新的 MATLAB 版本 (R2016b) 中,现在可以通过选择不同的布局方法或直接指定 x、y 和 z 坐标在 3d 中绘制节点-link 图形。在您的示例中,将绘图线替换为
p = plot(F,'XData',xyz(:,2),'YData',xyz(:,1),'ZData',xyz(:,3));
结果图: