Matlab--EOF分析

文摘   2024-07-18 09:00   河北  

Matlab--EOF分析


本文作者:第八星系-石头人

联系邮箱:2205455617@qq.com


数据:nc数据



读取数据


%% EOF分析
clc;clear;close all

%% 读取降水相关数据
datadir = 'E:\prep\';
% 循环读取降水数据
filelist=dir([datadir,'*.nc']);     
for  i = 1:129          
    ncid =[datadir,filelist(i).name];    
    time(:,i)=ncread(ncid,'time');    
    precip(:,:,i)=ncread(ncid,'precip');
end
path = [datadir,filelist(1).name];
ncdisp(path)
mlat = double(ncread(path,'latitude'));
mlon = double(ncread(path,'longitude'));
[nlat,nlon]=meshgrid(mlat,mlon);

%% 读取shp数据
cdL=shaperead("E:\世界地图shp\世界地图2017\2017世界地图.shp");
cx=[cdL(:).X]; cy=[cdL(:).Y];



处理数据


%% 计算
precip=(reshape(precip,20*14,129))';     % 将三维数据转化为二维数据

F=detrend(precip,0);                     % 移除均值(0阶多项式趋势)
C=F'
*F;                                   % 计算协方差矩阵C

[EOFs,D]=eig(C);                         % EOF特征向量,D特征值
PCs=EOFs'*F';                            % 时间权重PC

D=diag(D);                                % 提取对角线元素得到特征值序列
D=D./sum(D);                             % 特征值标准化

%% 第一模态
EOF1=EOFs(:,D==max(D));                  % 选取特征值最大的作为第一模态
PC1=PCs(D==max(D),:);

EOF1=reshape(EOF1,20,14);                % 重塑为20*14的空间数据

EOF1=EOF1.*std(PC1);                     % 标准化
PC1=PC1./std(PC1);
disp(max(D)*100)                         % 显示方差解释度

%% 第二模态
EOF2=EOFs(:,279);                        % 选取特征值第二大的作为第二模态
PC2=PCs(279,:);

EOF2=reshape(EOF2,20,14);

EOF2=EOF2.*std(PC2);
PC2=PC2./std(PC2);
disp(D(279,1)*100)



画图


%% 画图
figure('position',[300,10,1200,800])

% 第一模态空间分布
subplot(2,2,1);
m_proj('miller','lon',[min(mlon) max(mlon)],'lat',[min(mlat) max(mlat)]);
m_contourf(nlon,nlat,EOF1,'linestyle','none');
m_grid('linestyle','none','xtick',([108 120 132 144]));
hold on
m_plot(cx,cy,'k','linewidth',2); 
colormap(m_colmap('diverging'));
s=colorbar('fontname','Times New Roman','fontsize',12);
title(s,'mm/day','fontname','Times New Roman');
set(gca,'fontsize',12)
title('EOF1: 29.88%','fontsize',16,'fontname','Times New Roman');

% 第一模态时间序列
subplot(2,2,3);
plot(1:129,PC1,'r','linewidth',2);
hold on
plot(xlim,[0,0],'k--','LineWidth',1.5)
set(gca,'xtick',[2:30:129],'xticklabels',1979:10:2021, ...
    'fontname','Times New Roman','fontsize',12);
xlabel('Year','fontname','Times New Roman');
ylabel('PC1','fontname','Times New Roman');
xlim([1 129]);
% ylim([-2.5 2.5]);
set(gca,'fontsize',12,'linewidth',2)
title('PC1: 29.88%','fontsize',16,'fontname','Times New Roman');

% 第二模态空间分布
subplot(2,2,2);
m_proj('miller','lon',[min(mlon) max(mlon)],'lat',[min(mlat) max(mlat)]);
m_contourf(nlon,nlat,EOF2,'linestyle','none');
m_grid('linestyle','none','xtick',([108 120 132 144]));
hold on
m_plot(cx,cy,'k','linewidth',2); 
colormap(m_colmap('diverging'));
s=colorbar('fontname','Times New Roman','fontsize',12);
title(s,'mm/day','fontname','Times New Roman');
set(gca,'fontsize',12)
title('EOF2: 12.72%','fontsize',16,'fontname','Times New Roman');

% 第二模态时间序列
subplot(2,2,4);
plot(1:129,PC2,'r','linewidth',2);
hold on
plot(xlim,[0,0],'k--','LineWidth',1.5)
set(gca,'xtick',[2:30:129],'xticklabels',1979:10:2021, ...
    'fontname','Times New Roman','fontsize',12);
xlabel('Year','fontname','Times New Roman');
ylabel('PC2','fontname','Times New Roman');
xlim([1 129]);
set(gca,'fontsize',12,'linewidth',2)
title('PC2: 12.72%','fontsize',16,'fontname','Times New Roman');



参考图




  后台发送:群聊二维码

即可加入交流群,

群内每天分享所需数据






本文编辑:稚只


第八星系人造大气理论爱好者
记录与交流python、matlab等科研工具。记录与交流大气科学的学科知识
 最新文章