1. % %% 真实NDVI时间序列
    2. % y = [1459,1594,1479,1345,1714,1813,1654,1668,2375,2766,4348,5446,8045,8489,7373,7158,6205,4613,2401,2076,1045,1568,1459];
    3. % yr = iHANTS_chenjiu(y, 'nf',4, 'per',365, 'ts',1:16:353, ...
    4. % 'HiLo','Low', 'low',0, 'high',10000, 'scale_factor',0.0001,...
    5. % 'fet',500,'dod',0,'looplim',0,'delta',0.5,...
    6. % 'double_period',1, 'dynamic_weight',0, 'poly_order',0);
    7. %% 读取excel中的 daily NDVI 16d NDVI,并绘图
    8. clc;clear all;close all;
    9. %% 读取存储2019NDVI数据的excel
    10. data_year = 2019;
    11. data_year_str = num2str(data_year);
    12. % 存储 所有POI 一年 CGLSGLASS产品的FAPAR值、以及POILC类型值
    13. excel_name = '2019_h27v05_POI_daily_NDVI.xlsx'; % 待读取的excel路径
    14. %% 读取 16d NDVI
    15. NDVI_16d_sheet_name = [data_year_str, '_16d_NDVI'];
    16. NDVI_16d_data = xlsread(excel_name, NDVI_16d_sheet_name);
    17. NDVI_16d_data = NDVI_16d_data*0.0001; % 比例因子缩放
    18. [h1,w1]=size(NDVI_16d_data);
    19. ts_16d = 1:16:353;
    20. %% 读取 daily NDVI
    21. NDVI_daily_sheet_name = [data_year_str, '_daily_NDVI'];
    22. NDVI_daily_data = xlsread(excel_name, NDVI_daily_sheet_name);
    23. [h2,w2]=size(NDVI_daily_data);
    24. % 判断是平年还是闰年
    25. isLeapYear = (mod(data_year,400)==0)||(mod(data_year,4)==0 && mod(data_year,100)~=0);
    26. if isLeapYear==1
    27. ts_daily=1:1:366;
    28. else
    29. ts_daily=1:1:365;
    30. end
    31. %% 读取土地覆被类型
    32. LC_sheet_name = 'LC_IGBP';
    33. LC_data= xlsread(excel_name, LC_sheet_name);
    34. h3=length(LC_data);
    35. %% 读取FID,即兴趣点的编号
    36. FID_sheet_name = 'FID';
    37. FID = xlsread(excel_name, FID_sheet_name);
    38. h=min(h1,h2);
    39. h=min(h,h3);
    40. %% 土地覆被类型存储在一个cell中供索引
    41. LC_type_IGBP_cell={'Evergreen Needleleaf Forests','Evergreen Broadleaf Forests','Deciduous Needleleaf Forests',...
    42. 'Deciduous Broadleaf Forests','Mixed Forests','Closed Shrublands',...
    43. 'Open Shrublands','Woody Savannas','Savannas',...
    44. 'Grasslands','Permanent Wetlands','Croplands',...
    45. 'Urban and Built-up Lands','Cropland/Natural Vegetation Mosaics','Permanent Snow and Ice',...
    46. 'Barren','Water Bodies','Unclassified'};
    47. %% 创建存放重建序列的数据矩阵
    48. yr_16d = zeros(h1,w1);
    49. yr_daily = zeros(h2,w2);
    50. %% 循环读取并绘图
    51. for poi=1:h
    52. %% 判断该POILC类型,确定title
    53. if LC_data(poi)==255
    54. LC_name = LC_type_IGBP_cell{end};
    55. else
    56. LC_name = LC_type_IGBP_cell{LC_data(poi)};
    57. end
    58. %% ihants时间序列重建
    59. nf = 5;
    60. yr_daily(poi,:) = iHANTS_chenjiu( NDVI_daily_data(poi,:),...
    61. 'nf',nf, 'per',365, 'ts',1:1:365, ...
    62. 'HiLo','Low', 'low',0, 'high',1, 'scale_factor',1, 'delta',0.5,...
    63. 'double_period',1, 'dynamic_weight',0, 'poly_order',0);
    64. yr_16d(poi,:) = iHANTS_chenjiu( NDVI_16d_data(poi,:), ...
    65. 'nf',nf, 'per',365, 'ts',1:16:353, ...
    66. 'HiLo','Low', 'low',0, 'high',1, 'scale_factor',1,'delta',0.5,...
    67. 'double_period',1, 'dynamic_weight',0, 'poly_order',0);
    68. %% 绘制时间序列对比图
    69. fig = figure('Visible','off'); % 不显示绘图图窗
    70. set(gcf,'Position',get(0,'ScreenSize')); % 设置绘图为全屏绘制
    71. set(gca,'FontSize',12); % 设置plot横纵轴数字字体大小,注意这是全局字体大小设置,需要在标题大小设置的前面,否则会覆盖
    72. set(gca,'FontName','Times New Roman','FontSize',12,'LineWidth',1.5); % 设置坐标轴的字体和大小
    73. %% 绘制 daily NDVI 的时间序列图
    74. p1=plot(ts_daily,NDVI_daily_data(poi,:),':*k','MarkerSize',6,'MarkerFaceColor','k');
    75. % 'MarkerSize'设置绘图符号的大小;'MarkerFaceColor',设置绘图符号的填充颜色
    76. p1.LineWidth=1;
    77. title_name = ['NDVI Time Series Reconstraction Comparison: Daily vs 16d (POI-',num2str(FID(poi)+1),', ',LC_name,')'];
    78. title(title_name,'fontname','Times New Roman','FontSize',25);
    79. % 字体是Times New Roman,颜色是蓝色('b'blue),字体大小是20号。
    80. xlabel(['Day of Year(',data_year_str,')'],'FontSize',22);
    81. ylabel('NDVI','FontSize',22); %设置横纵轴名称及字体大小
    82. xlim=[0,366]; ylim=[0,1];
    83. set(gca,'xtick',0:10:360) % handles可以指定具体坐标轴的句柄
    84. set(gca,'ytick',0:0.1:1) % handles可以指定具体坐标轴的句柄
    85. axis([0 366 0 1]);%axis([xmin xmax ymin ymax]),设置绘制区域的范围
    86. %% 绘制 daily NDVI 的重建时间序列图
    87. hold on;
    88. p2=plot(ts_daily,yr_daily(poi,:),'-.ob','MarkerSize',3,'MarkerFaceColor','b');
    89. p2.LineWidth=1;
    90. %% 绘制 16d NDVI 时间序列图
    91. hold on;
    92. p3=plot(ts_16d,NDVI_16d_data(poi,:),'--*g','MarkerSize',6,'MarkerFaceColor','g');
    93. p3.LineWidth=2;
    94. %% 绘制 16d NDVI 重建时间序列图
    95. hold on;
    96. p4=plot(ts_16d,yr_16d(poi,:),'-sr','MarkerSize',6,'MarkerFaceColor','r');
    97. p4.LineWidth=2;
    98. %% 绘制图例
    99. leg=legend({'Original(Daily)',...
    100. 'Reconstracted(Daily)',...
    101. 'Original(16d)',...
    102. 'Reconstracted(16d)'},...
    103. 'Location','northeast');
    104. set(leg,'FontName','Times New Roman','FontSize',20,'FontWeight','normal');
    105. %% 写出对比图像
    106. frame = getframe(fig); % 获取frame
    107. img = frame2im(frame); % frame变换成imwrite函数可以识别的格式
    108. img_name = ['POI_',num2str(FID(poi)+1),'.jpg']; % 写出到dir_name文件夹中
    109. imwrite(img,img_name); % 保存到工作目录下,名字为img_name
    110. end
    111. %% 关闭绘图
    112. % close all;