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

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

[复制链接]
4 j7 a$ B" l& J8 k, Z T

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

2 x* a% k) W3 e3 I4 F! ^( c

matlab程序代码:

6 C+ w( X2 X0 _6 R: }8 F
%对图窗属性进行初始化 / ^! G6 [& U" Y% T! k' r figure1 = figure(1); %创建图窗并获取图窗句柄: P- w2 N8 H8 S6 |/ Q% E SIZE=get(0); %获取显示屏信息 0 Z% Z4 ?/ D3 h" P( _8 k set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小0 Z i, C) P; v x1 O7 _! T C=zeros(180,360); %预分配内存 - J' ^4 P X/ u3 G! }" k SY=zeros(22,1); %用于存储每一份数据的起始年份 ; d& z X3 f" ?- { STR1=cell(22,1); %用于存储变量名 7 y' P, W! C4 b STR2=STR1; %%用于存储文件名7 f6 B( K# t' G( b) p clim=[-1000,3500]; %设定imagesc的数值范围 ' p B0 f- i8 g; C! s6 j im=imagesc(C,clim); %创建image初始对象$ T& u) A0 D5 X colormap(jet); %指定颜色映射类型为jet+ t7 d" d) k7 [" g. d2 t txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份' M& m/ B! p x0 t4 F: h2 E* F title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);+ {, Z& x n+ q. p4 I4 \ axis off ) p* d% m! C1 O6 b hold on ; z% c$ a5 M8 E; g7 `7 \& d6 b cbar(); %显示预先设定的colorbar5 E* ]. p+ u2 u$ V %% / H) h' e, `- [& s a. l filename = SST.mp4;( c5 ]+ w8 |+ x! u) b" G fps=10;6 z4 ?3 W. k# T* \ WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象: u/ W- |/ j- E2 N! p WriteObject.FrameRate=fps;6 m: h, L/ C+ W. j) P; J' B WriteObject.Quality=100;# s0 E' t8 F ] open(WriteObject); % B( I% }4 D5 r$ ~ %%6 v @1 r8 ~/ `3 c SY(1:5,1)=[1870 1901 1931 1961 1991];: W) O( L0 i! V2 I# U3 m% v4 F% l STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};& M8 W) K# E+ j STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};+ a$ B ^( ~+ f; t; v for m=4:198 v+ U5 G4 f: L9 ]6 M$ O sy=2000+m; 0 L. F4 h, L+ G) k, _& j str1=[HadISST1SST20,num2str(m,%02d)]; & Z+ @: v- u F/ `7 n- _ str2=[SST20,num2str(m,%02d)];+ X1 F0 A+ d- v' V- n3 E( [2 ] SY(m+2,1)=sy; 8 }3 p2 B( o9 N0 \' F/ G STR1(m+2,1)={str1}; $ [8 H. h/ y; R ^ STR2(m+2,1)={str2}; 4 o, c! h( K* a. @. p* d0 U; O end& Q- [# G% B8 M" p* N/ f7 ? SY(end)=2020; % |, o1 q" P5 H, k; g( P7 { STR1(end)={HadISST1SST1};9 {% Q- k& d# {+ A+ J7 F; W9 g1 w STR2(end)={SST2020};. X4 [5 u2 x, p+ E4 f $ C9 v, b4 w% |# H% k6 p [rowsize,~]=size(SY); / G9 d0 F. a5 N4 _3 j# [ for i=1:rowsize 6 j. x& v. o* h9 @, f" x+ S shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)* t: }* M. Y% a/ r2 q end0 {7 W& t+ C0 Q- _* {9 f ' ]- j& [1 L( B) P hold off - @% ?2 P9 o, ?* M close(WriteObject) : r8 R8 R1 \7 V7 ~ %% ! w- |, A4 E! \& T1 Y functioncbar()Tem=(-10:5:35);# d3 Q" N: O1 [! p' P0 |! d. Z labcell=cell(1,10); %用于存储colorbar标签. u J. |1 |9 \! n' }; R$ H for i=1:10 % m. w" `0 w0 s' {# v/ P labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};& ?( }& L; E7 { end$ P8 O. G- \2 d6 ]3 D3 V cb=colorbar; ( z& u/ F5 h; q/ _9 I6 |+ c0 h3 Y+ o/ r cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex/ H [( I9 K1 g3 V# q cb.TickLabels=labcell;2 U2 S% X" X) U0 @* F3 O3 P, P cb.FontSize=12; $ U# [+ n! B8 y6 }0 d, N- U end) g N& }6 T* k2 ?1 M9 E , W" f& u& E; y/ a1 o functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); ; T# n/ Z. Z" @ eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 ' M0 P5 H, U3 ^9 D5 ^/ d n1=n1/181-1; %数据每181行是一个月的全球SST数据 $ s, k7 _+ j7 n" I; o ^) b for i=0:n1 ; g! a- w( A. b( \) ?7 J eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);. K# h* g; }/ r% ]. Y5 Q C(C==-32768)=NaN;5 u( V1 k. z: G% U8 ^* I set(im,CData,C); %更新im的CData属性 5 j6 \9 \8 }7 {, J set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度3 O/ I! o1 e8 D9 [1 |# a7 Y set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 * k2 F" \; H3 k, k0 S6 q6 T; |- Q0 J; a. h B frame=getframe(gcf); " x% Y+ Q, Y3 S- U6 n% R- U writeVideo(WriteObject,frame); 2 ?- k, X# d& O" E* [) S end $ L) A9 Y- n; {% C' s# f4 u& g eval([clear ,str1]); - e( f! z, X& J. {/ i* S) E end. _! o1 m- d1 g
}" l ~8 L4 Z- S

效果图:

2 V' h- u( \, `
7 q+ ^) g3 ~5 o' b+ f

数据来源网站:

: U3 {% Q+ k m; j; [/ O9 m3 G - K: K# Q$ ^) j1 y' h' ^) n: W) J/ Z

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

' i0 Q k- x$ l- E8 ?# o6 r& A

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

' Y7 b# g' P% |8 x! n " t/ V8 @' ^; V7 C

提取码8xt8。

2021.2.2更新

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

" V$ z+ J9 ^" v9 _' O

参考文献:

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" u6 d# _' i# t! X 3 \# D" n! t- W9 B2 ?0 G 7 D* M. f4 q2 J- j5 w7 p" f) `) x: h, G# W8 ]/ f 5 o' Y" E# h) d1 x: E
回复

举报 使用道具

相关帖子

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