收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

基于matlab的全球海洋表面温度数据可视化

[复制链接]
4 W" Q" g0 Y1 B

最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。

* \- W; w4 ]/ H0 F9 J/ I4 X8 C

matlab程序代码:

) R1 c" q" y& w/ x, {
%对图窗属性进行初始化 6 ?' A1 `& R: Y5 M6 I figure1 = figure(1); %创建图窗并获取图窗句柄4 b) H9 O/ G8 R! V+ A% W SIZE=get(0); %获取显示屏信息 5 `4 i' V' k1 l+ B4 M7 c set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小3 y; N. G) P" b) E/ Y5 W C=zeros(180,360); %预分配内存8 ^7 r( s! |7 ^2 ]. B% C SY=zeros(22,1); %用于存储每一份数据的起始年份1 k G. x% K1 n7 Q( X6 T. d STR1=cell(22,1); %用于存储变量名8 y" s, j, J! {& p& @ STR2=STR1; %%用于存储文件名1 v: o7 X+ z+ J9 c. T clim=[-1000,3500]; %设定imagesc的数值范围+ c5 {# |% w7 h* h9 C5 c: M im=imagesc(C,clim); %创建image初始对象0 C% |0 W* m3 o3 w colormap(jet); %指定颜色映射类型为jet+ \7 Q4 M+ [/ [0 ?/ b! Q+ P txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份1 b4 L: S& I% @ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); # U+ x/ c6 }2 W axis off & v" I4 X i4 H. e& I& C hold on . K% }1 |, F2 F6 Y: U/ Z cbar(); %显示预先设定的colorbar5 G6 k3 O& V" _3 U- c6 F %%) T5 T5 d& {7 Z. E* s& E filename = SST.mp4;4 Z' x# @5 \5 S5 n: a" w fps=10;$ V1 ^- w) }3 C WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 + C6 t7 `( d6 s! C WriteObject.FrameRate=fps;5 X6 m# ]4 f6 z2 ?/ K WriteObject.Quality=100;8 [" A( r& C$ }8 [2 `; }! X open(WriteObject); 6 D Y8 j+ j( f8 w9 L& k %%5 o1 o# e( L5 w* g SY(1:5,1)=[1870 1901 1931 1961 1991]; 8 N* A3 K8 }4 g9 l8 k! \ STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};" G: E: L( k; E' d* @ STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 6 y% f, y3 L& U _& n6 [ for m=4:19* i: A( U& t& X/ _; w sy=2000+m; - T" Y ] ~; `+ x5 o" F str1=[HadISST1SST20,num2str(m,%02d)];. }! g: e" ?* F% b0 ]/ }, [: c str2=[SST20,num2str(m,%02d)];# B$ @; T. q; L1 E A2 s SY(m+2,1)=sy; ; _, w6 h9 _2 @; r STR1(m+2,1)={str1};$ i) ]2 H" J2 g) L STR2(m+2,1)={str2};3 [# q7 l, \3 F1 J end: D+ v6 E4 }6 R: R- t& i SY(end)=2020;2 G$ E' k# `; s( e STR1(end)={HadISST1SST1}; 7 ~: P; }2 }7 m1 L2 n# R+ ] STR2(end)={SST2020};: U6 |; Z, G6 z) ?2 s + `9 D2 M: t: o. @: ^& J [rowsize,~]=size(SY); 5 }4 S/ m9 E' I1 z' j for i=1:rowsize / V0 k) E0 `/ \! R2 L/ e shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) + v) E9 ~4 Y1 ?) g- T8 ] end / c' y/ S& \0 v) r, \# ~$ G( o. B/ [) h, ~ hold off9 D& ~5 J1 U- ^1 O% u9 n- {( u close(WriteObject) + Z+ W! U8 C2 u: m9 W7 @6 n %%: d1 `- E2 l) w3 i& F" w functioncbar()Tem=(-10:5:35); + q0 f1 T) m8 k/ ]1 Y2 j1 h1 ^ labcell=cell(1,10); %用于存储colorbar标签/ C. x( U1 U* @# i for i=1:103 x+ l0 A' k. p: z labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};; K$ l+ I' q* K' V% O! \ end 3 h* {. a- {4 m4 C& W7 K cb=colorbar;0 g% ^- h+ @9 m! g4 X, H cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 3 ?9 M; d/ k1 x6 I# J% z cb.TickLabels=labcell;. _8 A* Q- u- D9 x& ^: m cb.FontSize=12;/ l) H; ?1 i- p" B1 V! H end ' d' _5 [6 ]7 L6 k" D l- Y3 x4 ?# @9 l5 j0 s6 l4 H functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); , S5 U! {# {3 r' g eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 ; x% J* ^5 b0 V( x! b n1=n1/181-1; %数据每181行是一个月的全球SST数据 # J' r b8 W/ P for i=0:n1 ( [4 l( a8 ~+ ]9 v! S eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); % ~0 }; a& s3 x- b+ d C(C==-32768)=NaN; % Y4 @' ^# G( W X) l: S c set(im,CData,C); %更新im的CData属性 # X4 N! ]$ m( y- s1 p9 |. B1 A set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 |" Z5 X* k! G/ L; M; \ set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本- T# f4 K! E7 I+ F, e & B4 q1 u1 ~2 d# Z frame=getframe(gcf);1 f8 O9 t* v) q( K$ m writeVideo(WriteObject,frame); + `9 K; P4 z W s end * O4 P5 R# F6 n5 Y eval([clear ,str1]);% z% f [+ {7 k, ?$ z# ^1 P! W end# I# I5 n/ f/ a" j5 G( f! P: c
8 V& a+ n) {3 t$ F

效果图:

, F) U4 g& _( ^
! L* a {6 s( u9 W

数据来源网站:

7 j; k# D0 L9 b; {" O P7 Y8 @ 6 T* g7 J6 e: I" ~

(引用声明:HadISST data were obtained from https://www.metoffice.gov.uk/hadobs/hadisst/ and are © British Crown Copyright, Met Office, [year of first publication], provided under a Non-Commercial Government Licence http://www.nationalarchives.gov.uk/doc/non-commercial-government-licence/version/2/)

) S! ^- f5 f. f) o: v

代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:

* K5 T2 i- f7 Q. N% g # J7 M+ l( A& `

提取码8xt8。

2021.2.2更新

有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)

3 X: s' @3 S6 L3 y2 R

参考文献:

Rayner, N. A.; Parker, D. E.; Horton, E. B.; Folland, C. K.; Alexander, L. V.; Rowell, D. P.; Kent, E. C.; Kaplan, A. (2003) Global analyses of sea surface temperature, sea ice, and night marine air temperature since the late nineteenth century J. Geophys. Res.Vol. 108, No. D14, 4407 10.1029/2002JD002670& H8 D, ?' {9 }- c1 ` . T* W7 X7 p# O3 k5 p* `, L6 E3 `' H4 k; C2 L h7 I8 }$ P, ]/ S( I& `, d' h8 Q6 J7 R% m. v3 o2 {
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
盖好我的小被子
活跃在3 天前
快速回复 返回顶部 返回列表