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

[复制链接]
+ w" s, ]: @$ b& S) r- }- Z

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

1 @' L$ ?& G' g, J, g5 Z( _

matlab程序代码:

! j+ q5 O6 N& x0 Q
%对图窗属性进行初始化 1 U+ a2 d; u3 {& `( W- S figure1 = figure(1); %创建图窗并获取图窗句柄% m7 z9 n, u* h. i- Z$ a- U9 g; p SIZE=get(0); %获取显示屏信息 6 X9 w- h1 g) j9 v2 H0 ^ set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 + U( x! H. g3 x5 K' q' ^9 q( i C=zeros(180,360); %预分配内存- m+ m; X. R" w, \$ v% h6 P SY=zeros(22,1); %用于存储每一份数据的起始年份$ f5 T$ M5 n6 y) ?0 L& n STR1=cell(22,1); %用于存储变量名* z% d7 d) U& v6 G STR2=STR1; %%用于存储文件名 9 r, w ~$ ]! Y clim=[-1000,3500]; %设定imagesc的数值范围' A1 z6 H1 t% u$ B7 v9 O+ x im=imagesc(C,clim); %创建image初始对象 ! `0 Z8 U' W% h) f, ] colormap(jet); %指定颜色映射类型为jet5 O- s+ S" T6 v6 x txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 + i3 V0 V' q, ~6 ^ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);5 j- B- t/ c0 ~ axis off 3 b0 K8 r, a2 Y- B hold on) u4 p$ J& R& c& j$ U cbar(); %显示预先设定的colorbar ; W a' C* R' u9 W3 s$ q6 t %%. Z7 \( G4 }5 n% Y filename = SST.mp4; % _; g4 L! l: K$ @/ _% _& q5 i fps=10; + e% D) t( O1 w9 Z% v! q5 z9 \4 r WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象) @' m$ v, `7 z: {3 D/ ~0 l* h; O WriteObject.FrameRate=fps; $ Z9 _) ~+ s+ P- A/ ^, x' n WriteObject.Quality=100; / b, K6 m* d% Z open(WriteObject);7 v( f8 J8 k' o3 k- z$ m; i- v1 {$ Q %%/ W$ r m! {$ L5 _4 }: p SY(1:5,1)=[1870 1901 1931 1961 1991];9 J# Q! X! }: r T/ D STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; 0 F! b+ V. v2 y STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};. |. k) Q# U' d$ k for m=4:19 O" x I, t/ H sy=2000+m;0 C( N0 S Y. {. G& G! e4 J5 b str1=[HadISST1SST20,num2str(m,%02d)]; 6 t0 c* E7 l* r, c- R str2=[SST20,num2str(m,%02d)];& s' P; y! A- }) f4 z SY(m+2,1)=sy;% j! b6 V- g# c( r, G0 f9 S STR1(m+2,1)={str1};- F0 [2 t O* E$ B STR2(m+2,1)={str2}; 5 u1 U' m: {" [" Q& ~ end + f5 P) v( H4 G o k SY(end)=2020; * t5 g+ X# h e STR1(end)={HadISST1SST1};. _: w8 b9 ?/ @/ u1 ~0 Z STR2(end)={SST2020};0 ~9 u$ X3 ]1 a: J# x# r 7 a1 [! w; l" {- b [rowsize,~]=size(SY); 5 b3 X& o) n& m* F, o5 L for i=1:rowsize # @8 q# T# D8 B" x7 q; l shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 4 E) P E: S7 z) P) K end t7 R. [+ x x ?8 e: s3 P * G0 @" [; ~" y+ s! @5 ~ hold off* I. u% G _" a% a0 `7 E close(WriteObject)6 H# N6 U. E0 _% b9 ^7 |5 m" \# [ %%6 y- f, F7 w( d! a functioncbar()Tem=(-10:5:35);9 {) k; d5 B6 M, H labcell=cell(1,10); %用于存储colorbar标签 ( D% l5 y; U3 d for i=1:10 2 o. @$ I- [6 K" S labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; 8 j' W; n, Y$ ^8 Y4 {5 b6 `/ M6 q end 3 T. O4 S+ O4 Z cb=colorbar; ! u2 `+ J1 }! q4 U# Z/ r, W9 ] cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 4 t" |& n0 V: q/ i! M4 k3 @6 y cb.TickLabels=labcell; 0 E2 X) j6 p& @ cb.FontSize=12; ( s+ p# V# v- z end( q8 a4 i( t7 Q2 j / k# q9 ?7 ~$ |5 O# ~8 R' y functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);7 y8 M# ? @5 A: X) C: O eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句. }( C! N* t; X n1=n1/181-1; %数据每181行是一个月的全球SST数据% ?5 ]6 L }4 _1 l for i=0:n1 % G1 m7 U& F0 x9 e8 U: f/ _ eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);. U( k9 T2 a* ~0 L( L3 s( Z C(C==-32768)=NaN;$ w! `4 Y( m3 y; e5 L, ? set(im,CData,C); %更新im的CData属性+ q( x5 o8 v! E set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度5 E7 Z$ ]2 U8 p1 |+ n% q% h' H1 T set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本( F/ `" M! x* e 2 L7 a# p% ~3 l( p" v# s frame=getframe(gcf);& W2 z- w$ m ~) B+ W3 [ e" I- k1 W writeVideo(WriteObject,frame); 0 s' Y* `8 O. t b- R" U end6 n# p2 {9 n+ Q eval([clear ,str1]);3 o/ q9 ` l6 `1 T' Z9 _5 }6 y6 y# q end9 J' i' J8 G0 i* V$ k
. k9 u' J( Y- P$ ]

效果图:

+ [- t$ [0 P: a
( g5 A5 A) t. w- v: c- r6 H

数据来源网站:

?1 |* f, _9 @ & G0 Y" V2 `& s! [- d! y! D! Q

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

5 T& u, e( L/ C. i8 F, b

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

- G1 E3 U6 X% W6 U* x% g 9 e# }$ O+ A; ^8 i

提取码8xt8。

2021.2.2更新

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

: v; l' l" d* v/ K5 j/ G

参考文献:

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' _5 a4 k7 }% h2 V ( }8 F2 |, p4 c/ ^. ^ S% u3 }9 {) c9 o # c5 C. X7 H- d; S; \ : r1 |. E. D' m; F6 X3 N: ]. G# v
回复

举报 使用道具

相关帖子

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