2014-01-27 4 views
1

Я пытаюсь построить месячную статистику, которая охватывает более 2 лет, где 1 год содержит только один месяц данных, а другой - 11 месяцев. Там, где у меня возникают проблемы, на этикетке легенды, когда я заполняю ярлык, он берет один месяц данных с первого года и помещает метки следующего года, как будто он заполняется в этом месяце. Вот что я имею в виду:Создание легенды наборов данных переменной длины + игнорирование пустых ячеек

legendms=['PIC2 -- HHN Jan 13', 'PIC2 -- HHN Feb 13', PIC2 -- HHN March 13', 'PIC2 -- HHN Apr 13', 'PIC2 -- HHN May 13', 'PIC2 -- HHN June 13', 'PIC2 -- HHN July 13', 'PIC2 -- HHN Aug 13', 'PIC2 -- HHN Sept 13', 'PIC2 -- HHN Oct 13', 'PIC2 -- HHN Nov 13', 'PIC2 -- HHN Dec 12'] 

Где 13 это на 2 значное представление для 2013 года, и 12 за 2012 г. Он делает это, хотя я на велосипеде в течение многих лет в порядке. Я считаю, что это потому, что легенды на 2012 год - это, по сути, пустые ячейки, за исключением Dec, и поэтому он просто заполняет пространство. Он также не соответствует соответствующим стилям линии. Он помещает 13 января другой стиль линии «-», чем остальные, когда 12 декабря должен быть другим стилем линии. Кто-нибудь знает об этом, или как игнорировать пустые ячейки, сохраняя при этом полную легенду?

Вот код, который у меня есть до сих пор, возможно, я просто делаю простую ошибку? Любая помощь будет принята с благодарностью!

close all; 
    for ms=1:length(stats) 
    legendms=[]; 
    for i = 1:length(files) 
     figure 
     for y = 1:length(files(i,1).year) 
    if (files(i,1).comp(1) == 'H') 
     xvals = files(i,1).allData{7}(1:114); 
    elseif (files(i,1).comp(1) == 'B') 
     xvals = files(i,1).allData{7}(1:95); 
    end 
     for m = 1:length(files(i,1).year(y).month) 
    %Set up generic month string 
    if ~isempty(files(i,1).year(y).month(m).(x{ms})) 
    monthString = {'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'}; 
    %Set up month string particular to this dataset 
    mString= monthString(1:length(files(i,1).year(y).month)); 
    yString=cellstr(num2str(year)); 
    %Set up axis variable particular to this dataset 
    axisVar = [1 length(mString) -70 10]; 
    LineColors={rgb('red') rgb('blue') rgb('green') rgb('indigo') rgb('cyan') 
    rgb('orange') rgb('HotPink') rgb('DarkGray') rgb('purple') rgb('BurlyWood') 
    rgb('yellow') rgb('Salmon')}; 

    %Loop through stats to plot 
semilogx(xvals,files(i,1).year(y).month(m).(x{ms}),LineStyles{y}, 'Color', LineColors{m}, 
'LineWidth',lWidth) 
hold on 

%Set axis interval 
axis([0.1, 172, -190, -80]); 

%Set the axis label max, min, and interval for the Yaxis 
    set(gca,'YTick', [-190:10:-80]) 

    %Label x and y axis and create cell for legend for each sta, loc, chan per 
    %file to use below. Make title for each plot 
    xlabel('Period (s)','FontSize',labelSize); 
    ylabel('Power (dB)','FontSize',labelSize); 
    legendms{m} = [legendms ' ' files(i,1).sta ' ' files(i,1).loc ' ' files(i,1).comp ' ' 
    monthString{m} ' ' yString{y}(3:4)]; 

    title([x{ms} ' ' 'Monthly Comparisons', ' ' num2str(files(i,1).allData{2}(1)) '/' 
    num2str(files(i,1).allData{3}(1)) '/' num2str(files(i,1).allData{1}(1)) '-' 
    num2str(files(i,1).allData{2}(end)) '/' num2str(files(i,1).allData{3}(end)) '/' 
    num2str(files(i,1).allData{1}(end))],'FontSize',titleSize); 

    end 
    end 
end 

    %Plot NLNM and NHNM models and label legend for each figure 

    semilogx(nlnmx,nlnmy,'k-','LineWidth',lWidth) 
    semilogx(nhnmx,nhnmy,'k-','LineWidth',lWidth) 
    hold off 
    legend([legendms, 'NLNM', 'NHNM'], 'Location', 'EastOutside') 
    end 
    end 

Повторит Я хотел бы легенду игнорировать пустые ячейки для любого из лет и построить ярлык легенды в порядке с лет, используя соответствующие цвета и станцию ​​этикетку. 2012 год должен быть сплошной линией, а 2013 - пунктирной линией, причем любые цвета являются репрезентативными для месяца, который они описывают (lineColors).

+0

Вы повторяете файлы 'files' и' files (i).год в порядке - правильно ли они отсортированы? Имейте в виду, если вы используете 'dir' вы _must_, предположите, что список файлов несортирован, так как вы получаете любой заказ, который система чувствует, как предоставление вам. – Notlikethat

+0

Да, они правильно отсортированы, поскольку они разделены внутри моей структуры, так что файлы (i, 1) .year (1) - 2012, а файлы (i, 1) .year (2) - 2013 год. то в 2013 году, но я думаю, так как пустые ячейки существуют в 2012 году, он заполняет в 2012 году стиль линии и цвет 2013 года. Как вы думаете, может быть, это из-за цикла через m, что есть 12 месяцев в каждом? Даже если все двенадцать ячеек не заполнены? – user1332577

+0

Вы знаете, как обойти это поведение? – user1332577

ответ

1

Вы увеличиваете легенды с переменной «m», которая проходит через все файлы, даже когда они пусты. Тем не менее, вы работаете только с использованием semilogx, когда файл не пуст.

Либо:

Создать новую переменную (начиная с 0) и увеличить его в заявлении

if ~isempty 

, и использовать эту переменную в legendms,

или

использования legendms {end + 1}, поскольку @notlikethat сказал, чтобы растянуть его, после инициализации его в пустую ячейку.

PS: Если вы используете удерживать все, а не удерживать, вам не нужно определять цвета линий.

+0

Lazarus, вы можете объяснить больше тем, что вы подразумеваете, создать новую переменную, если ~ isempty. Вы имеете в виду, что мне нужно было бы упустить или определить новый? Проблема с его повышением заключается в том, что для индексации соответствующих julian дней для данных, которые у меня есть, у меня есть много пустых полей дней и месяцев, которые имеют пустые статистические вычисления (x {ms}). Легенды {end + 1}, похоже, работают так, как я хочу. Удержание - отличный совет и что-то, чего я не знал, но как его заставить использовать разные цвета для каждой линии? Казалось, что он зациклился на одном сюжете. – user1332577

+0

Оставьте оператор if там же. Выше инструкции if установите count = 0, а после оператора if установите count = count + 1. Затем используйте legendms {count}. Тем не менее, легенды {end + 1} также верны. Да, удержание все будет проходить по тем же цветам - я не заметил, что вы определили 12 цветов (по одному на каждый месяц, который я предполагаю). – Lazarus

+0

Одна вещь, хотя легенды {end + 1}, кажется, сохраняют все старые значения легенд, мне нужно, чтобы они удаляли их, когда они перемещаются по файлам. Кажется, это не очищает его ... – user1332577

0

Мне кажется, что каждая запись легенды - это накопление всех предыдущих записей, что для меня не кажется правильным. Я думаю, что я бы заменить эту строку кода:

legendms{m} = [legendms ' ' files(i,1).sta ' ' files(i,1).loc ' ' files(i,1).comp ' ' 

monthString {т} '' yString {у} (3: 4)];

с этой строкой кода:

legendms{m} = [' ' files(i,1).sta ' ' files(i,1).loc ' ' files(i,1).comp ' ' 

monthString {т} '' yString {у} (3: 4)];

Поскольку вам не хватает данных, вы должны удалить пустые записи из массива ячеек легенды перед вызовом легенды. Я предлагаю добавить такой код, чтобы удалить пустые элементы массива ячеек.

is_empty = cellfun(@isempty, legendms); 
legendms = legendms(~is_empty); 
+0

Thanks user3194690! Я попробовал это, так как это было похоже на то, что я думал и тестировал. Кажется, что вы увеличиваете количество ячеек, когда вы двигаетесь в течение месяца, но не даете точно то, что я хотел. Возможно, я помещаю компонент cellfun в неправильный цикл - куда бы он пошел? – user1332577

Смежные вопросы