我试图绘制一些跨越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)。
答案 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);