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

[复制链接]
, N* \" C, L4 ~2 C. S& s. r

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

; w3 w- ?9 _! L" j/ I( e6 h

matlab程序代码:

* m" E4 ]$ Z. Z ^, I1 c
%对图窗属性进行初始化 $ L' T# ^3 C# M* q+ T figure1 = figure(1); %创建图窗并获取图窗句柄( A' _* f- K2 N' u6 O5 I+ M/ ?# P/ F SIZE=get(0); %获取显示屏信息 7 @" D( q. {7 C6 j; ^) J' @& m set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 ' a0 a) @: L' U# T7 A C=zeros(180,360); %预分配内存+ D6 I: L$ u9 j9 d! _ SY=zeros(22,1); %用于存储每一份数据的起始年份 & |! ~8 A2 P Q* c STR1=cell(22,1); %用于存储变量名 ! V+ Y0 G3 N: T7 ]$ V# k2 w% g! ? STR2=STR1; %%用于存储文件名 2 p+ Y! q8 {* V! K+ \+ y* k& K' n clim=[-1000,3500]; %设定imagesc的数值范围" i: P1 k; Q# Y) Z! R y2 ]. K8 h im=imagesc(C,clim); %创建image初始对象 ^, u. p) x; {) d: v" Z; b colormap(jet); %指定颜色映射类型为jet6 _" y9 _' |. M, Q1 @ txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份6 o" S& b, E# C% C title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); 7 o& ^ |7 \9 E a8 M axis off R" D$ S" t, ~/ z1 [5 ] hold on ) J- l& H7 U. [' F" U cbar(); %显示预先设定的colorbar, I5 s; k4 Z( A: w& e& q8 g) ] %%2 |: y* h6 V$ j. L! P filename = SST.mp4;! ^; [+ u* ^ G' H- [' N8 v9 L6 Q fps=10; + k1 F2 z5 @" _! ? F WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 & v$ r9 M0 d! Y/ ^1 ^( W* j3 d! r1 {& j0 r WriteObject.FrameRate=fps; 0 o4 v! l) L0 J/ A! \4 \ WriteObject.Quality=100; : v' h* F4 |7 y: _3 J- N7 y open(WriteObject); 2 T' u+ ]; P& w' d7 q# m %% 8 [7 t6 Y5 R1 o! ]: Z! I SY(1:5,1)=[1870 1901 1931 1961 1991]; D+ [7 H) \4 b9 P" F; l STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};$ a0 ^1 e( e8 P" |; u& j( b( P/ M j% ` STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; " y. [& d8 ~5 N7 }) g) N; X4 Q5 r( f for m=4:19' f$ ?1 o& j% ]+ \ sy=2000+m; + e. @# N1 n5 w, S$ S$ _ str1=[HadISST1SST20,num2str(m,%02d)]; 0 L; q" d- Y& W8 @ str2=[SST20,num2str(m,%02d)]; / w/ k* c1 _- T# R SY(m+2,1)=sy; * k3 |% E* b) E STR1(m+2,1)={str1}; 2 f( ~4 I5 `6 I& ?; S/ d0 G' W P STR2(m+2,1)={str2};1 c1 y0 b; R+ n4 g- N end + z U( f. L' z. L- B SY(end)=2020; 5 i! u5 h$ W# T STR1(end)={HadISST1SST1}; 9 g5 Y: U) [" P/ g% I5 J STR2(end)={SST2020};6 H) p5 C3 J# _, F/ O+ o' x5 ? & ^! `7 ?2 _0 C4 i$ D [rowsize,~]=size(SY); 8 o6 R1 @) h6 U! L% H/ a5 G for i=1:rowsize8 B2 k; z9 m& a4 a/ \+ k( V( Y shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt); `% Y4 G9 C4 j end6 l- T2 s4 H" _* Z # S3 Q; L- B' O+ Y5 j hold off" C& H. {( ]: P close(WriteObject)3 G, O0 K1 G! I) D %% 9 ]! H( p/ b5 u! K" r functioncbar()Tem=(-10:5:35);! h+ I/ L4 P+ C labcell=cell(1,10); %用于存储colorbar标签+ U, E7 O& Y7 S3 R, j1 A& I for i=1:10- Z- ~" K* O8 N3 y6 S) |: s! {! U labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};+ ], h9 F9 e L. w. ^: c! l% Q end 4 P; h; w- r# v9 J cb=colorbar;/ X# v8 f* R5 i8 J1 E6 u, O' t cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 9 v( h! s' j" Y* y9 M/ R' R6 F. K' k& ~ cb.TickLabels=labcell;- Z2 R* C* L* \1 G1 C, j! q- G cb.FontSize=12;& D( d2 [ Z r9 r* {% ?* u$ B! w end! e) v1 u0 ~; n; m8 U9 C - _* J% O3 D. g T# I functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);: {- N" g3 X; U' Z- A: c eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句, z0 I( Q0 H0 ^ n1=n1/181-1; %数据每181行是一个月的全球SST数据6 h+ v' T6 z) y6 y* S for i=0:n1 ( Q. \$ p7 Z2 V% v- _( S7 u3 L) ` eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);, u; U9 i2 T6 p9 M/ I/ p& x! m( l C(C==-32768)=NaN; 8 y- M4 p& R ] set(im,CData,C); %更新im的CData属性 / g6 b; n* l2 f0 k X# B set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度$ U8 I/ U) `- V# g6 K8 i, x set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 - s1 }, b3 w- M+ t- I / u8 M$ C! f. Z( ]4 y7 f$ a& ~* ? frame=getframe(gcf); ) c1 F5 h6 N. p: W' Z9 y writeVideo(WriteObject,frame); ' Q1 N% A; S- k$ ~ end ) ^* C5 A0 S0 [: J) n5 v( w eval([clear ,str1]);, Z; P1 l1 O: d8 Y \8 p( E( \ end& E. c5 G y3 `2 w$ n
- |) y" V7 o9 v" `2 a. z

效果图:

7 G1 G* s9 W' z+ y u
% {5 W+ J* U) G

数据来源网站:

* C( Y/ ^# S! n* E+ b& ^& }" I4 k. N % J6 K# W6 n- Y: c, Y; s5 m' b

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

$ q3 S" }1 j3 ?/ b! L

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

9 t, A9 ]2 E4 y0 S7 Q+ x. Y # Q, b& o2 d" x0 l% i- X

提取码8xt8。

2021.2.2更新

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

& |* W J& u, F# d$ ^# S

参考文献:

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 , _4 t* e; c4 S3 v& x% G& i2 ~ 8 u5 e4 W+ z3 t; _1 P @" d ' l5 V$ o, l# C; i# L1 w, J% G: j! y9 g$ H & v+ w6 S7 I1 O- q" N: k3 N
回复

举报 使用道具

相关帖子

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