フィルターのクリア

Node lablel overlaping Edge lable

6 ビュー (過去 30 日間)
Mohamed
Mohamed 2022 年 9 月 4 日
回答済み: Kausthub 2023 年 9 月 14 日
Node lablels are overlaping Edge lables , as per the attached photo , what can i do to avoide that situation , also i wanna change the Node lable to be on the center of the Node not on the right of it
  4 件のコメント
Chunru
Chunru 2022 年 9 月 5 日
attach your codes and data.
Mohamed
Mohamed 2022 年 9 月 5 日
networksheet=Minia24NewMinia3DPS1;%This XL sheet is Imported Manually
distrbutionsheet=Minia24NewMinia3DP;%This XL sheet is Imported Manually
NodesTestTable=distrbutionsheet.NameOfRMUNetworkNode;
Edgestesttable=[networksheet.From networksheet.To];
realedges=table(Edgestesttable,'VariableNames',{'EndNodes'});
g=graph(realedges);
startxdata=-1.5;
n=0;
networksheetROWNUMBERS=size(networksheet,1);
distrbutionsheetROWNUMBERS=size(distrbutionsheet,1);
nodessize=size(g.Nodes);
reallength=table(networksheet.Lengthm,'VariableNames',{'Length'});
getedgelable=[realedges reallength];
edgelabletableinM=table(ones(size(networksheet.Lengthm)));
nameoflable=string(table2array(g.Nodes));
poweroflable=string(table2array(g.Nodes));
connecteddp=string(table2array(g.Nodes));
mergedtable=cell(distrbutionsheetROWNUMBERS,1);
%Creating Edge Lable
for idx=1:networksheetROWNUMBERS
subbasin_no=g.Edges{idx,"EndNodes"};
cond1=networksheet.From==subbasin_no{1,1}&networksheet.To==subbasin_no{1,2};
cond2=networksheet.To==subbasin_no{1,1}&networksheet.From==subbasin_no{1,2};
k=find(cond1|cond2,1,"first");
edgelabletableinM.Var1(idx)=networksheet.Lengthm(k);
end
edgelabletableinKM=table2array(edgelabletableinM).*0.001;
%Creating Node Lable
for ndx=1:nodessize
nodcom=g.Nodes{ndx,"Name"};
FLAGID=strcmp(nodcom,networksheet.OutgoingFeeder);
trueflagd=nonzeros(FLAGID);
if trueflagd==1
nameoflable(ndx)=nodcom;
poweroflable(ndx)='';
connecteddp(ndx)='';
else
kk=find(distrbutionsheet.NameOfRMUNetworkNode==g.Nodes{ndx,"Name"});
nameoflable(ndx,1)="_ "+distrbutionsheet.NameOfRMUNetworkNode(kk);
poweroflable(ndx,1)=distrbutionsheet.RatedPowerkVA(kk)+"KVA";
connecteddp(ndx,1)=distrbutionsheet.ConnectedDPName(kk);
end
end
strNodname=string(nameoflable);
strNodpower=string(poweroflable);
strNodeDP=string(connecteddp);
nodeslabletable=[strNodname,strNodpower,strNodeDP];
strnodeslabletable=join(nodeslabletable,newline,2);
%Ploting Graph
h=plot(g,"EdgeLabel",edgelabletableinKM,"NodeLabel",strnodeslabletable,NodeLabelMode="manual",NodeFontName='ArialMT' ...
,NodeFontAngle='normal',NodeFontWeight='normal');
%Adjusting Xdate and YDate to show Feeders sepratly
for id=1:nodessize
nodcom=g.Nodes{id,"Name"};
FLAGID=strcmp(nodcom,networksheet.OutgoingFeeder);
trueflagd=nonzeros(FLAGID);
if trueflagd==1
n=n+1;
startxdata=startxdata+500;
h.YData(:,id)=15;
h.XData(:,id)=startxdata;
else
h.YData(:,id)=h.YData(:,id-1)-1;
h.XData(:,id)=startxdata;
end
end
%Highlieght NO Point of the Network
for i=1:networksheetROWNUMBERS
if networksheet.OutgoingFeeder(i)==networksheet.From(i)
highlight(h,[networksheet.From(i)],"NodeLabelColor","red")
end
if networksheet.NOAssociatedTofromOrtoOrboth(i)=="from"
highlight(h,[networksheet.From(i)],"NodeLabelColor","green")
targetcable=[networksheet.From(i) networksheet.To(i)];
realtragted=table(targetcable,'VariableNames',{'EndNodes'});
gg=graph(realtragted);
highlight(h,gg.Edges{:,"EndNodes"},"EdgeColor","green","LineStyle","--")
elseif networksheet.NOAssociatedTofromOrtoOrboth(i)=="to"
highlight(h,[networksheet.To(i)],"NodeLabelColor","green")
targetcable=[networksheet.From(i) networksheet.To(i)];
realtragted=table(targetcable,'VariableNames',{'EndNodes'});
gg=graph(realtragted);
highlight(h,gg.Edges{:,"EndNodes"},"EdgeColor","green","LineStyle","--")
end
end
%Adjusing Node postion on Figure by darging and release
set(gcf,'WindowButtonDownFcn',@(f,~)edit_graph(f,h))
function edit_graph(f,h)
% Figure out which node is closest to the mouse.
a = ancestor(h,'axes');
pt = a.CurrentPoint(1,1:2);
dx = h.XData - pt(1);
dy = h.YData - pt(2);
len = sqrt(dx.^2 + dy.^2);
[lmin,idx] = min(len);
% If we're too far from a node, just return
tol = max(diff(a.XLim),diff(a.YLim))/20;
if lmin > tol || isempty(idx)
return
end
node = idx(1);
% Install new callbacks on figure
f.WindowButtonMotionFcn = @motion_fcn;
f.WindowButtonUpFcn = @release_fcn;
% A ButtonMotionFcn that changes XData & YData
function motion_fcn(~,~)
newx = a.CurrentPoint(1,1);
newy = a.CurrentPoint(1,2);
h.XData(node) = newx;
h.YData(node) = newy;
drawnow;
end
% A ButtonUpFcn which stops dragging
function release_fcn(~,~)
f.WindowButtonMotionFcn = [];
f.WindowButtonUpFcn = [];
end
end

サインインしてコメントする。

回答 (1 件)

Kausthub
Kausthub 2023 年 9 月 14 日
Hi Mohamed,
I understand that while plotting the graph, the edge labels are overlapping, and you would like to align the node labels to the centre instead of right alignment.
The overlapping error occurs due to the Adjusting Xdata and YData to show Feeders separately” step where you assign the same Xdata to multiple nodes.
h.XData(:,id)= startxdata;
Instead, you could add a small random number to Xdata to make all the edges visible and remove the overlapping.
h.XData(:,id)= startxdata + 100*rand(1);
In case of aligning the nodes to the centre, there is a no documented property of ‘GraphPlot(https://www.mathworks.com/support/search.html/answers/477770-is-it-possible-to-change-the-position-of-graph-plot-node-labels.html) that allows you to change the placement of the labels relative to the nodes. However, you could remove the labels and replace them with your own matching text labels. That way you have complete control over the placement of each label. The bellow mentioned snippet does this for you:
text(h.XData, h.YData, h.NodeLabel,...
'HorizontalAlignment', 'center', 'FontSize', 8);
h.NodeLabel={};
I am also attaching the updated code for better understanding.
Hope this helps and clarifies your issue regarding overlapping node labels and aligning them to the centre!

カテゴリ

Help Center および File ExchangeGraphics Performance についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by