如何使用循环标记图形边缘?

时间:2017-05-27 19:26:07

标签: matlab plot graph matlab-figure

我使用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函数中。

2 个答案:

答案 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循环并尝试查看是否有效。