Назначение легенды в цикле Matlab - PullRequest
3 голосов
/ 21 марта 2012

Я попытался задать легенду в цикле, но она перезаписывает ранее написанную легенду, как их можно вставить в оператор if или в цикл for.Confused

    clear;
        vin=10
 for m=1:1:14;  

        vin=vin+10
    for i=1:1:27
        Wa_Ac = PVinv.CoreSizeModel();
        PVinv.CoreSelect(Wa_Ac,i);   
        loss_ind_core= PVinv.InductorLossModel(PVinv.m_L_Selected);

        if(i==1)
        p=plot(vin,loss_ind_core,'--gs');
        hold on
        end
        if(i==2)
        p=plot(vin,loss_ind_core,'--rs');
        end %...till i=27

        legend(obj.m_Core_List(i).name);
        xlim([10e3 90e3])
        set(gca,'XTickLabel',{'10';'20';'30';'40';'50';'60';'70';'80';'90'})
        grid on
        xlabel('Vin');
        ylabel('Power loss');
    end
 end

Вызываемая функция

function obj = CoreSelect(obj, WaAc)
             obj.m_Core_Available= obj.m_Core_List(i);
            obj.m_L_Selected.m_Core = obj.m_Core_Available;

end 

Ответы [ 3 ]

10 голосов
/ 21 марта 2012

Создать массив ячеек для хранения имен легенды.Перед циклом for определите что-то вроде

legend_names = cell(1,27 * 14);

Затем, во время цикла заполните ячейку:

legend_names{27*(m-1)+i} = obj.m_Core_List(i).name;

После end установите легенду:

legend(legend_names);

Возможно, я неправильно понял индексы (m против i) и то, как они связаны с именами, но дело в том, что вы можете передать массив ячеек в функцию легенды, чтобы создать легенду за один раз..

Пример:

>> legend_names=cell(1,2);
>> legend_names{1} = 'str';
>> legend_names{2} = 'str2';
>> plot(0:4,0:4)
>> hold on
>> plot(1:5,0:4)
>> legend(legend_names)

, что даст enter image description here

3 голосов
/ 21 марта 2012

Вместо того, чтобы собирать строку легенды, вы можете просто установить DisplayName -property в ваших командах заговора. Кроме того, вы можете собрать linespec аргументы в массиве ячеек, чтобы избежать дублирования кода, т.е.

linespec = {'--gs','--rs',... %# etc

(...) 

for i=1:1:27
        Wa_Ac = PVinv.CoreSizeModel();
        PVinv.CoreSelect(Wa_Ac,i);   
        loss_ind_core= PVinv.InductorLossModel(PVinv.m_L_Selected);


        p=plot(vin,loss_ind_core,linespec{i},'DisplayName',obj.m_Core_List(i).name);

end        

legend('show')
2 голосов
/ 21 марта 2012

Столкнувшись с такой ситуацией, каждый раз в цикле я добавляю строку легенды в массив строк, например,

legstr{i} = obj.m_Core_List(i).name; 

и затем отобразить легенду один раз, после окончания цикла:

legend(legstr);
...