我使用for
循环在我的绘图上添加更多节点和边。但是,当我在新边缘添加标签时,旧标签将被删除。我不知道如何保留旧的边缘标签,也不知道如何存储labeledge
的结果。
这是我到目前为止所得到的。
for r = 1: 10
for j = 1:10
H = addnode(P,nodeName{r}{j});
P = addedge(H, s{r}{j}, t{r}{j}, w{r}{j});
figure;
hold on;
h = plot(P);
labeledge(h,s{r}{j},t{r}{j},labelText{r}{j})
end
end
每次在新剧情中,我只能看到最新的标签集群,而旧标签已经消失。理想情况下,我喜欢hold on
labeledge
的结果,但hold on
无法做到这一点。我需要在循环的每个步骤中显示标签,因此添加另一个整体labeledge
不是我理想的解决方案。任何提示都将不胜感激。
编辑:我的所有变量都是单元格数组中差异大小的多个单元格。我使用for
循环来帮助从单元格中提取向量,因为我不知道如何将来自此类单元格数组等的所有信息级别插入到addNode
函数中。
答案 0 :(得分:1)
代码中的主要问题是您一次又一次地绘制图表。这不是必要的。相反,使用一个循环来创建图形对象(G
),然后一次绘制所有图形,然后使用另一个循环来标记图形:
P = graph;
for r = 1: 10
for j = 1:10
P = addedge(P, s{r}{j}, t{r}{j}, w{r}{j});
end
end
h = plot(P);
for r = 1: 10
for j = 1:10
labeledge(h,s{r}{j},t{r}{j},labelText{r}{j})
end
end
如果您希望在每次迭代中绘制图表,可以使用subgraph
:
for k = 1:height(P.Nodes)
H = subgraph(P,1:k);
figure;
h = plot(H);
c = 1;
out = false;
for r = 1: 10
if ~out
for j = 1:10
if c < k
labeledge(h,c,labelText{r}{j})
else
out = true;
break
end
c = c+1;
end
else
break
end
end
end
除此之外,你应该知道(from Matlab documentation):
为获得最佳性能,请使用一次图表调用一次构建图表。对于大型图形,在循环中添加节点或边缘可能会很慢。
此外,无论上述建议如何,为了更轻松地处理数据,您应首先将单元格转换为数组。如果您的单元格数组在每个单元格中包含不同数量的元素,那么最好将其全部折叠为一列:
C = [s{:}]; % and the same for t and w
while any(cellfun(@iscell,C))
C = vertcat(C{:});
end
C = cellfun(@(x) x(:),C,'UniformOutput', false);
S = vertcat(C{:});
Labels = [labelText{:}]; % and the same nodeName
while any(cellfun(@iscell,Labels))
Labels = vertcat(Labels{:});
end
答案 1 :(得分:0)
尝试删除'数字;'命令退出FOR循环并尝试查看是否有效。