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

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

[复制链接]
, v+ M7 B2 ?. g1 N0 Z4 ?+ J* G

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

# u8 N$ n2 l- g# @- r3 V

matlab程序代码:

3 q2 C: n$ p4 k# D
%对图窗属性进行初始化 / g' G1 ]' d# a) ]3 f$ f( Z figure1 = figure(1); %创建图窗并获取图窗句柄 3 l d$ T6 d7 Z6 W2 T! n6 T SIZE=get(0); %获取显示屏信息 7 d l) w: B2 D7 D n8 x set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 % M. z; n, y& m2 [! v" B F$ M C=zeros(180,360); %预分配内存" ?& @) s# B; N2 D$ \ SY=zeros(22,1); %用于存储每一份数据的起始年份 0 \* ~" [! i6 i STR1=cell(22,1); %用于存储变量名 : \5 B3 ]4 G+ j& p5 N) ? STR2=STR1; %%用于存储文件名 + k9 F0 m. P0 s6 N3 `( E6 q clim=[-1000,3500]; %设定imagesc的数值范围; q$ J3 ]3 T0 I8 ]! C+ I im=imagesc(C,clim); %创建image初始对象 ; z8 l) @7 u2 j+ r. `0 P0 w colormap(jet); %指定颜色映射类型为jet) p+ p1 O! W- z4 P c" J" S1 ^ txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 0 y) m" \# a- M1 x1 x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);4 z S+ {; {2 o" s6 W F axis off # p$ ^2 y# r% i& L: z! Z( M5 I hold on - ?$ p8 \# {, A' [4 x* v! { cbar(); %显示预先设定的colorbar0 B* |( s/ D5 W' S5 U %%& {1 d0 C0 Q% ?$ y: X filename = SST.mp4;! h5 Y1 C1 E$ C5 F; N; J1 r& j) P fps=10; - z8 I4 f9 K* l WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 & e; l! \/ F2 ~/ q: d WriteObject.FrameRate=fps; 8 R; V' t6 _0 U WriteObject.Quality=100; \- m) t9 }7 m# z# M open(WriteObject);- k4 w- F5 d8 ?: C %%; u, P" X) ~+ ~( Q/ @ _ SY(1:5,1)=[1870 1901 1931 1961 1991];) u; J; r9 e2 T( C STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; * E! V0 y' P2 k' i STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};' J# k3 B0 I A4 N" b# o' I for m=4:19' h/ P8 m' ]8 P2 g! w% \2 T sy=2000+m;; z/ P8 b$ v' @* N4 g+ C str1=[HadISST1SST20,num2str(m,%02d)];3 l0 A. y$ D/ D0 T9 g str2=[SST20,num2str(m,%02d)]; 9 v6 W3 F" [6 E3 s' l/ R! x" P SY(m+2,1)=sy;0 o' n4 s% s, U) q4 [2 ^ STR1(m+2,1)={str1};0 v p- U. K: e) ^6 u; b: B% F STR2(m+2,1)={str2};& w6 q6 h/ v5 ]3 O! Z end 9 Q$ H- l/ J; k% n SY(end)=2020; 9 V0 p# S8 p/ `: M* { STR1(end)={HadISST1SST1};9 Z$ R- A6 `+ f; M. x6 h2 q7 V" Q STR2(end)={SST2020}; 6 d3 ?% `; R9 n 0 s C3 t W- i. p! u" b& H [rowsize,~]=size(SY);# j8 H, r# S* S6 A+ o9 u for i=1:rowsize " ~& ^: p: O& {5 L* ~' [ shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)* ]- N. r- ~9 e* g5 C end 0 S+ O% F# k9 C" W" c& s; V9 U% G9 V. w hold off ) s2 B+ x4 |" s" ` close(WriteObject)2 b: k0 z8 v& w4 O N8 j %% & o0 j. x2 H9 f+ Y; X2 e w functioncbar()Tem=(-10:5:35); / `- F; A V4 J' X4 J labcell=cell(1,10); %用于存储colorbar标签 * Z. l$ P( E R; m for i=1:104 o5 ^0 H n% }: y z labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};7 C- R- s2 H+ p# k end: j! Z6 C& o! j3 F cb=colorbar;' H( s# ]; b3 k( e& N# I cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 0 m r! ]/ l/ d2 {, U cb.TickLabels=labcell; ' @8 Y/ |& Y. f9 h/ ~8 o cb.FontSize=12;" V- R7 i' [0 A, h- w end % ^7 l8 F5 w% J7 y% b % Y' e. E, z& G5 u functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);7 }2 R& w9 V: p+ y& M) M" M eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句4 B6 J% i! C7 U) w- G+ q n1=n1/181-1; %数据每181行是一个月的全球SST数据8 a2 Q' I$ w4 Q for i=0:n1; w* `- s4 {* S$ A$ `+ n eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);: D6 k1 y0 a9 i1 a C(C==-32768)=NaN;$ d6 A- L! ]5 H% W" n) L1 R8 d set(im,CData,C); %更新im的CData属性 5 v7 m# v5 V" q9 ^: R- e. h set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度5 |# q4 C# D1 u R: j0 W set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本# \+ \/ Z3 w& r2 q' O 3 P1 l7 D! G+ C, z. A' u2 n frame=getframe(gcf);2 I% p3 ~& ]9 M$ d/ E, N* W writeVideo(WriteObject,frame); 1 `* H4 W) m/ H+ ~/ L end3 o, w2 G) ^9 ?' e eval([clear ,str1]); ' [/ F) \+ z& G5 a0 a0 d end* P# p R# P1 Y" F- t6 I
T& K9 l: G6 Z( e y, l+ o

效果图:

1 F) W$ W* ^* X9 i. n
% _2 S8 u* t5 c+ H. V9 B4 s

数据来源网站:

& Y7 J& r; u8 B4 ~7 W* C: I % D+ w6 H% l2 Q+ K7 u

(引用声明: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) V/ R r5 t" r; C

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

! C+ w5 W) m1 j' f* \; Y. F5 ] , ?0 }& @" W: H4 Q

提取码8xt8。

2021.2.2更新

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

# T" w# p& e; A! t- m ]

参考文献:

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 " H; e2 a3 T" Z% K& R4 I 1 P* F$ \" A3 Z; p" G: \+ g; ~ 6 Y, i) \- r( c; r. j' a, q5 h& e/ U6 ]" u" ` C 3 o* O7 L' g; I5 m
回复

举报 使用道具

相关帖子

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