创建可变长度数据集的图例+忽略空单元格

时间:2014-01-27 04:58:14

标签: matlab legend is-empty variable-length-array

我试图绘制一些跨越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是2013年的2位数表示,2012年是12位。即使我按顺序骑自行车,这样做也是如此。我相信这是因为2012年的传奇故事基本上是空的细胞,除了12月,所以它只是填补空间。它也没有遵循适当的线条样式。它标注1月13日不同的线条样式' - ',而12月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)。

2 个答案:

答案 0 :(得分:1)

您正在使用变量“m”递增图例,该变量循环遍历所有文件,即使它们为空。但是,您只是在文件不为空时使用semilogx进行绘图。

或者:

创建一个新变量(初始化为0)并在

中递增它
if ~isempty

语句,并在图例中使用该变量,

使用legendms {end + 1}作为@notlikethat表示在将其初始化为空单元格之后将其展开。

PS:如果你使用hold all而不是hold on,则不需要定义线条颜色。

答案 1 :(得分:0)

在我看来,每个传奇条目都是所有先前条目的积累,这对我来说似乎不正确。我想我会替换这行代码:

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

monthString {m}''yString {y}(3:4)];

使用这行代码:

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

monthString {m}''yString {y}(3:4)];

由于缺少某些数据,因此在调用图例之前,您需要从图例单元格数组中删除空白条目。我建议添加这样的代码来删除空单元格数组元素。

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