溝端 浩平 / Kohei Mizobata
MATLAB Memo

1. M_MAP を使ってベクトルなどを描画

冬季の海氷密接度、海氷ベクトル、海面気圧、海上風の平均場を M_MAP でまとめて描画する例です。海洋・海氷・大気の複数変数を 1枚に重ねて表示する、実務的な図化の流れを示しています。

M_MAP Sea Ice Wind Vector SLP IBCAO Lambert Projection

メモ

それぞれのバイナリは予め用意しておく想定です。

M_MAP パッケージ をダウンロードしてパスを通しておきます。旧メモでは \MATLABのパス\toolbox\local\setup.maddpath しておくことを勧めています。

m_pcolor は単精度 single では描画しない。

描画例

海氷密接度、海氷ベクトル、海面気圧、海上風の平均場
冬季の海氷密接度(shaded)、海氷ベクトル、海面気圧、海上風を 1枚に重ねた例。

スクリプト例

旧ページの内容をそのまま使いやすい形で残しています。コメントの赤字部分は、 何をしている処理かを説明する注釈です。

clear ; clc ; clf ; close all
%% make freezing season mean field ice, Uice, SLP and UVwnd

%------- read latlon info. --------------- AMSRデータの緯度経度情報を読み込み
fid = fopen('/home/kmizobat/work/AMSR/AMSR-PS/IC0/latlon_low_NP','r');
latlon = fread(fid,[900,1800],'short');
lat = latlon(:,1:900)/100. ; lon = latlon(:,901:1800)/100.;

%% ------- read IBCAO flat file 10801x751 2-byte integer [65-90N, 0-360E]
ibf = ['/home/kmizobat/work/MAP/IBCAO/IBCAO_ver2_23_GEO_netCDF_2min.flat']; 予め用意したIBCAOのデータを読み込み
fidib=fopen(ibf,'r') ; ibd=fread(fidib,[10801,751],'short'); fclose(fidib);
ibd2=-ibd(5401:8101,:); % Extract
sprintf('%s','finish reading IBCAO')

iblon=zeros(2701,751) ; iblat=iblon;
for j=1:751
    iblat(:,j)=90-(j-1)*((90-65)/751);
    for i=1:2701
    iblon(i,:)=-180+(i-1)*(360/10801);
    end
end
for jk=1:751
    for ik=1:2701
        if(iblon(ik,jk) < 180 & iblon(ik,jk) >= 0)
            ibd2(ik,jk)=NaN;
        end
        if(iblat(ik,jk) > 81 | iblat(ik,jk) < 65)
            ibd2(ik,jk)=NaN;
        end
    end
end
sprintf('%s','finish modifying IBCAO')

%% loop start ここからForループの始まり
for yr=2002:2009
  yr2=num2str(yr);
  icef=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/' yr2 '.fallmean.flat'] %海氷密接度ファイル指定
  uicef=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/' yr2 '.fallmean.mve.mat'] %氷速ベクトル東西成分のファイル指定
  vicef=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/' yr2 '.fallmean.mvn.mat'] %氷速ベクトル南北成分のファイル指定
  uwndf=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/uwnd.' yr2 '.fallmean.flat'] %風速ベクトル東西成分のファイル指定
  vwndf=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/vwnd.' yr2 '.fallmean.flat'] %風速ベクトル南北成分のファイル指定
  slpf=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/slp.' yr2 '.fallmean.flat'] %海面気圧のファイル指定
  ofl=['/home/kmizobat/work/AMSR-kamo/winter/sim_raw/mat/FALLMEAN/',yr2,'.frzup.jpg']; ofl %出力ファイル名の指定

  fid = fopen(icef,'r'); ice = fread(fid,[900,900],'float'); clear fid;
  load(uicef) ; load(vicef);
  fid = fopen(uwndf,'r'); uwnd = fread(fid,[192,94],'float'); clear fid;
  fid = fopen(vwndf,'r'); vwnd = fread(fid,[192,94],'float'); clear fid;
  fid = fopen(slpf,'r'); slp = fread(fid,[144,72],'float'); clear fid;

  %% modifying ice conc. data % 欠損データの除去
  for jk=1:900 ; for ik=1:900
      if(lon(ik,jk) < 180 & lon(ik,jk) > 0)
          ice(ik,jk)=NaN;
      end
      if(lat(ik,jk) > 81)
          ice(ik,jk)=NaN;
      end
  end ; end

  %% modifying icevec. data
  for jk=1:151 ; for ik=1:159
      if(mve(ik,jk) < -8000 )
          mve(ik,jk)=NaN;
      end
      if(mvn(ik,jk) < -8000 )
          mvn(ik,jk)=NaN;
      end
  end ; end

  %% modifying slp data
  plon=zeros(144,72) ; plat=zeros(144,72);
  for jj=1:72 ; for ii=1:144
      plon(ii,jj)=0+(ii-1)*2.5;
      plat(ii,jj)=-90+(jj-1)*2.5;
      if(plon(ii,jj) < 180 & plon(ii,jj) > 0)
          slp(ii,jj)=NaN;
      end
      if(plon(ii,jj) > -120 & plon(ii,jj) <= 0)
          slp(ii,jj)=NaN;
      end
  end ; end
  ind=find(plon >= 180) ; plon(ind)=plon(ind)-360; clear ind;

  %% modifying uvwnd data
  hlon=zeros(192,94) ; hlat=zeros(192,94);
  for jj=1:94
    for ii=1:192
      hlon(ii,jj)=0+(ii-1)*1.875;
      hlat(ii,jj)=-88.542+(jj-1)*1.914893617;
      if(hlon(ii,jj) < 180 & hlon(ii,jj) > 0)
         uwnd(ii,jj)=NaN; vwnd(ii,jj)=NaN;
      end
    end
  end
  ind=find(hlon >= 180) ; hlon(ind)=hlon(ind)-360; clear ind;

  %% maping ice conc etc...
  m_proj('lambert','lat',[65 81],'lon',[-180 -120]); %ランベルト図法に指定
  hold on;

  [cs,hs]=m_contourf(lon,lat,ice,[10:1:100]);
  a=flipud(cptcmap('GMT_white-blue', 'mapping', 'showall','ncol',18));
  colormap(a) ; h=colorbar; caxis([10 100]);
  set(get(h,'ylabel'),'String','Sea ice concentration(%)','fontsize',12);
  set(hs,'LineStyle','none')

  %% landmask and coast line
  m_usercoast('cst','patch',[.4 .4 .4]); % 海岸線の描画

  %% Contour --- IBCAO
  [c2,h2]=m_contour(iblon,iblat,ibd2,[600:600:1800],'k','linewidth',1,'linest','-'); %海底地形のコンターライン

  %% Contour --- SLP
  [c,h]=m_contour(plon,plat,slp,[1008:2:1030],'k-','linewidth',2); %高気圧側
  clabel(c,h,'fontsize',12); h1 = clabel(c,h);
  set(h1,'FontName','Arial');
  set(h1,'Fontsize',12);
  [c,h]=m_contour(plon,plat,slp,[980:2:1006],'k-','linewidth',2,'linest','-.'); %低気圧側
  clabel(c,h,'fontsize',12); h1 = clabel(c,h);
  set(h1,'FontName','Arial');
  set(h1,'Fontsize',12);

  %% Vector mapping
  s=60 ; % ベクトルのスケールファクター
  ik=2 ; jk=2; %ベクトルデータの間引き加減
  lon2=slon(1:ik:159,1:jk:151);
  lat2=slat(1:ik:159,1:jk:151);
  ve2=mve(1:ik:159,1:jk:151);
  vn2=mvn(1:ik:159,1:jk:151);

  hh=m_quiver(lon2,lat2,ve2,vn2,4,'linewidth',1.)); % 氷速ベクトル描画
  set(hh,'Color',[0 0.6 1]);

  s2=30;
  ik=2 ; jk=2;
  hlon3=imresize(hlon,[192,188],'bilinear'); hlat3=imresize(hlat,[192,188],'bilinear');
  uwnd3=imresize(uwnd,[192,188],'bilinear'); vwnd3=imresize(vwnd,[192,188],'bilinear');

  hlon4=hlon3(1:ik:192,1:jk:188);
  hlat4=hlat3(1:ik:192,1:jk:188);
  uwnd4=uwnd3(1:ik:192,1:jk:188);
  vwnd4=vwnd3(1:ik:192,1:jk:188);

  m_vec(s2, -150, 67.7, 10, 0, 'r', 'key', 'Wind 10 m s^{-1}','EdgeColor','k'); % 風速ベクトルのリファレンス
  m_vec(s2,hlon4,hlat4,uwnd4,vwnd4,'r','shaftwidth',1.2,'headangle',45); % 風速ベクトル描画

  m_grid('box','fancy','tickdir','in');
  xlabel('Ice(shaded)+Uice(cyan)+SLP(blk)+WND(red)','fontsize',14);
  title([yr2 ' Frz-up season'],'fontsize',30,'fontweight','bold');

  hold off;
  print('-djpeg','-r200',ofl);
  close all;
end