如何用datenum处理年份数组及自定义英国衰退期绘制衰退图?
解决方案
我来帮你解决这两个问题,刚好我之前也处理过类似的时间序列和衰退标注需求:
1. 用datenum转换年份数组
你的Year是113×1的年份数组(1900-2012),Matlab的datenum函数可以直接将年份转换为日期序列号,默认取当年的1月1日作为对应日期(如果你的数据是年度数据,这个处理完全够用)。具体代码如下:
% 假设你的年份数组名为Year(113×1) date_num = datenum(Year, 1, 1);
解释一下:datenum(year, month, day)接受三个参数,这里我们统一传入1月1日,这样每个年份都会被转换成当年第一天的日期序列号,后续绘图时就能正确识别时间轴顺序了。
如果你的数据是年度平均值,也可以用年中日期(比如7月1日)来转换,代码改成:
date_num = datenum(Year, 7, 1);
2. 自定义英国衰退时间段(替代默认NBER数据)
recessionplot默认调用的是美国NBER的衰退数据,要标注英国的衰退,有两种实用方法:
方法一:直接给recessionplot传入自定义衰退起止日期
首先你需要确认英国官方(比如ONS)定义的衰退时间段,比如假设已知的英国衰退年份是[1920-1921]、[2008-2009]等(请替换为实际权威数据)。然后将这些起止年份转换为datenum格式,再传给recessionplot:
% 定义英国衰退的起止年份(每行一个衰退周期) uk_recession_periods = [1920 1921; 2008 2009]; % 转换为datenum格式的起止日期(这里取年份的第一天和最后一天) start_dates = datenum(uk_recession_periods(:,1), 1, 1); end_dates = datenum(uk_recession_periods(:,2), 12, 31); % 先绘制你的经济数据(比如GDP) plot(date_num, GDP_data); % date_num是之前转换的日期序列号,GDP_data是你的数据数组 hold on; % 调用recessionplot绘制自定义衰退阴影 recessionplot(start_dates, end_dates); hold off;
方法二:手动用fill函数绘制阴影(更灵活)
如果觉得recessionplot的自定义参数不够灵活,直接用fill函数绘制灰色阴影是更简单的方式,不需要依赖内置函数的限制:
% 先绘制你的经济数据 plot(date_num, GDP_data); hold on; % 定义英国衰退时间段 uk_recessions = [1920 1921; 2008 2009]; % 遍历每个衰退周期,绘制阴影 for i = 1:size(uk_recessions, 1) % 转换起止日期为datenum start_date = datenum(uk_recessions(i,1), 1, 1); end_date = datenum(uk_recessions(i,2), 12, 31); % 获取y轴的范围,确保阴影覆盖整个绘图区域 y_min = min(GDP_data); y_max = max(GDP_data); % 绘制灰色半透明阴影 fill([start_date, end_date, end_date, start_date], ... [y_min, y_min, y_max, y_max], ... 'gray', 'FaceAlpha', 0.3, 'EdgeColor', 'none'); end hold off;
这种方法的好处是你可以自由调整阴影的颜色、透明度,甚至针对不同衰退周期设置不同样式,完全不受内置函数的限制。
内容的提问来源于stack exchange,提问作者BenBernke
相关产品推荐
相关产品推荐

