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

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

[复制链接]
: B7 e: }$ u# q" s. g5 ~5 Y

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

& M4 R0 U* A$ B6 ]! e( C) }

matlab程序代码:

6 a3 a# j! T7 m# j2 _. |
%对图窗属性进行初始化" f W: y! G: t+ c9 X& @6 X figure1 = figure(1); %创建图窗并获取图窗句柄 $ J m0 A7 U$ z: C/ C& A8 R SIZE=get(0); %获取显示屏信息 . [- E0 W3 p1 f& G# W set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 6 _0 k3 b+ G+ r w C=zeros(180,360); %预分配内存 ! a i5 J1 y0 ^% a+ P7 | SY=zeros(22,1); %用于存储每一份数据的起始年份9 J, H4 m9 P5 D* h STR1=cell(22,1); %用于存储变量名 - _' K# W1 P& h! h STR2=STR1; %%用于存储文件名: z/ G) N& m0 S7 y* Y clim=[-1000,3500]; %设定imagesc的数值范围& V4 U* @% P [' Q im=imagesc(C,clim); %创建image初始对象 # l) c8 b1 J) r0 G$ m: L9 @ colormap(jet); %指定颜色映射类型为jet 9 x0 S- c5 ~: G$ h- ~6 G txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 # ?2 J4 ]; m8 ^( u" ~& m1 _3 _/ P title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); ) \; J4 U' b8 j, W axis off. q# v1 U7 f6 r3 ^ hold on - }2 y A x+ q0 k2 g7 q6 O* ? cbar(); %显示预先设定的colorbar" | a5 H i, d, U %%4 p% ?3 p( a' p7 A filename = SST.mp4;$ ]) r5 \7 C( | fps=10;/ p' |* Z1 i% p( |. I @" D0 ? WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象7 n [: g: u- y) m WriteObject.FrameRate=fps; 2 `5 r, D3 |; l! ?$ |1 F2 S% S7 K WriteObject.Quality=100; 3 k e/ i0 d7 q( }0 ^( D8 J open(WriteObject);% D4 e9 {, d0 { %%9 h3 q" K. G) i$ J. Y SY(1:5,1)=[1870 1901 1931 1961 1991]; 4 D( Q8 W3 `+ N- {5 V/ I STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; g# v" ~/ j; W+ H STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};3 P* \8 J) A! r d) Y7 Q for m=4:19 - l- t/ o, P) z% m: p sy=2000+m;4 }3 x x+ c+ ]1 Q/ t str1=[HadISST1SST20,num2str(m,%02d)]; # E; B& ]! Q: p str2=[SST20,num2str(m,%02d)];' x% V0 b, [9 r5 S SY(m+2,1)=sy;7 f& _! _( Z) q& x. \ STR1(m+2,1)={str1};1 }, S1 K# P) D1 `; Z STR2(m+2,1)={str2};" z V1 o# N! g+ E: |7 F end + H, p0 L2 X& x% m SY(end)=2020;. a+ P0 |9 D/ P) a STR1(end)={HadISST1SST1}; * K' q: W2 K. M* { STR2(end)={SST2020};- u' s# O1 _1 Q- g& V : O j7 ?+ D9 u1 @5 [' a* _% [ [rowsize,~]=size(SY);5 p9 U7 X+ Y- l i- F for i=1:rowsize+ p8 u, t8 J2 t6 J) P, O( b! `- P shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) " g' t) b9 K4 M end0 y& N- L7 E, b1 M) v8 k: B; M% L 9 ^$ u1 y7 X# W' O3 C0 L h. U& N' c& ? hold off% X. Q* h! X% I8 Z" p& W8 b close(WriteObject)8 ]( o8 I, F7 b. _ %%- J4 f3 b5 U% v! |4 S& k functioncbar()Tem=(-10:5:35); . a# ~9 r* l9 x5 U labcell=cell(1,10); %用于存储colorbar标签 8 n- G S3 g) N/ ^9 k1 Y" s/ V" O for i=1:10 9 _4 \- Y8 I; o) n" [" D labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; - g9 Z+ }" \; t1 M end 6 ~6 T/ K _! ]) X/ y2 q cb=colorbar; ' O% Z b% Z- r9 D& C) Z. M4 _ cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex) E8 m! p \) E. u4 Q9 N cb.TickLabels=labcell; / Y6 [* b4 v4 c: t' ?; X cb.FontSize=12; - q/ Y- }7 f; s0 K- S$ t end( o/ W( z8 ~8 |6 J: {- Z& D ( k! ?9 D1 t% K1 r0 Y4 { functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);+ d1 C, t3 @+ C, M eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 0 ^4 y4 _/ f. r& d' q; X$ Q7 p n1=n1/181-1; %数据每181行是一个月的全球SST数据$ f5 U8 T& P9 }! z8 ` for i=0:n1) I! J( t9 y: N eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); ' c5 u' {0 _( c3 M& Y% G3 `2 W) h C(C==-32768)=NaN;( P' c5 q0 E. W2 k" F- s* A# N set(im,CData,C); %更新im的CData属性 % w; }, h" e) u9 m c$ }4 |1 U set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度2 f- z+ f; ]4 G) d2 s set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本, o" _7 [8 }4 n: F* T/ k+ @' q5 [ D) ~) d& O0 l frame=getframe(gcf);3 H' l! u8 q/ V. H writeVideo(WriteObject,frame); 9 s9 c. ]" p8 t8 m end4 l3 S8 E2 I2 Z9 C! D& y1 l; e eval([clear ,str1]);: I' d! | M! p& y# n. a5 u" Y7 \ end: F" }" d7 ^6 ~8 V0 [; E& i' v
9 X' F5 h0 I6 F6 G: Z' m. Z' @7 Z

效果图:

* n" J# r. J. h' I5 f, Z
; u+ m6 G, V _( W; d4 j% w7 ~

数据来源网站:

, m1 W4 l% k" e+ l8 n3 q! D 1 i: q5 I% M: o5 c

(引用声明: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/)

8 R( ]$ _% F* {$ k+ {

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

) U0 j3 Z* G0 ^( Q g9 u# v8 D' N & h+ z# M9 H$ M( y# G) I. a% Z

提取码8xt8。

2021.2.2更新

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

+ A! R$ G6 Y, W6 z# q6 Q

参考文献:

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/2002JD0026709 ~# {- m5 k7 I $ V/ L$ S; `, a4 l9 J# T A) j- q& K! h# C- }; ^. ? / |& J! P# t- I% C # \7 [1 U# k P
回复

举报 使用道具

相关帖子

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