I would like to plot a graph consistent with the connectivity properties written in 'edge' with a customized width of the edges.
node = [100 -50 -50 -86.6025 0 86.6025;0 86.6025 -86.6025 50 -100 50;0 0 0 200 200 200];
edge = [1 2;2 3;3 1;1 4;2 5;3 6];
type = [1; 1; 1; -1; -1; -1];
EdgeTable = table(edge, ...
'VariableNames','EndNodes');
structure=graph(EdgeTable);
p=plot(structure,'XData', node(1,:), 'YData', node(2,:),'ZData',node(3,:));
p.NodeColor='black';
diameter=20*ones(length(edge),1); % define diameter of struts by using the coefficient
diameter(type>0)=1; % define diameter of cables by using the coefficient
labeledge(p,1:numedges(structure),(1:length(edge)))
p.LineWidth = diameter;
However the result is:
As it can be noted, the grapf doesn.t match the properties of the connectivity as well as the labeledge. Maybe, it happens because the EdgeTable is automatically rewritten by reordering the nodes. Is it right?
How can I fix this problem?

 채택된 답변

Steven Lord
Steven Lord 2020년 1월 27일

0 개 추천

You are correct that the edges stored in the Edges table of the structure variable have been reordered, and so the values in type are not being applied to the edge you think they are. One solution is to add them as additional data to your Edges table.
>> EdgeTable = table(edge, type, 'VariableNames',{'EndNodes', 'type'});
>> structure=graph(EdgeTable)
Now if you look at structure.Edges the type variable has been reordered to match the ordering of the edges. Instead of using type later in your code, use
structure.Edges.type

댓글 수: 3

Gaetano Pavone
Gaetano Pavone 2020년 1월 27일
편집: Gaetano Pavone 2020년 1월 27일
Thanks a lot. Following your suggestion I have edited my code as follows:
node = [100 -50 -50 -86.6025 0 86.6025;0 86.6025 -86.6025 50 -100 50;0 0 0 200 200 200];
edge = [1 2;2 3;3 1;1 4;2 5;3 6];
type = [1; 1; 1; -1; -1; -1];
EdgeName={1:length(edge)};
EdgeTable = table(edge,type,EdgeName, ...
'VariableNames',{'EndNodes','type','EdgeName'});
structure=graph(EdgeTable);
p=plot(structure,'XData', node(1,:), 'YData', node(2,:),'ZData',node(3,:),'EdgeLabel', G.Edges.EdgeName);
p.NodeColor='black';
diameter=20*ones(length(edge),1);% define diameter of struts by using the coefficient
diameter(type>0)=1;% define diameter of cables by using the coefficient
% labeledge(p,1:numedges(structure),(1:length(edge)))
p.LineWidth = diameter;
but it doesn't work...
I know that Edgename should be as:
EdgeName={'1' '2' '3' '4' '5' '6'}';
bu I don't know a smart way to built it. How can I do this?
You can make EdgeName a string array instead of a cell array of characters, which is much easier to construct:
>> string(1:4)
ans =
1×4 string array
"1" "2" "3" "4"
If you're using a sufficiently recent release:
EdgeName = string(1:size(edge, 1)).'

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Graph and Network Algorithms에 대해 자세히 알아보기

제품

질문:

2020년 1월 27일

댓글:

2020년 1월 27일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by