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

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

[复制链接]
. X& w9 y( _8 d$ e- f0 B

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

" S2 t! q! R4 B! V: U

matlab程序代码:

5 |1 l; g5 K( l; E/ J
%对图窗属性进行初始化 ! N, A! j/ h9 {* [4 } figure1 = figure(1); %创建图窗并获取图窗句柄( K9 Q, U" K$ |. W SIZE=get(0); %获取显示屏信息3 i# L# m( L3 ~3 y: P. |& m0 P set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 ( P+ [6 z; x+ u1 b& k1 w. K C=zeros(180,360); %预分配内存& E; ~) K& t q8 m6 m SY=zeros(22,1); %用于存储每一份数据的起始年份 & E7 L" A, G1 t% y$ [( E3 X# x6 [ STR1=cell(22,1); %用于存储变量名; m4 q" [3 d" Q9 e$ y# F- [) X STR2=STR1; %%用于存储文件名# B" q6 c' j! ~4 J5 l clim=[-1000,3500]; %设定imagesc的数值范围 7 w8 ?2 p$ L$ N- W* D im=imagesc(C,clim); %创建image初始对象" R, P- o8 Y; z9 L ] colormap(jet); %指定颜色映射类型为jet ; w5 F; y* F P0 s* k+ e3 S txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 ) u/ A3 x2 V& u( H2 i" b) I& x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); % f1 o7 d4 [- F/ B0 h1 J' _7 e axis off& P1 y3 a9 C. f' }# r1 A hold on 7 B: M7 T- x6 k) C cbar(); %显示预先设定的colorbar 8 d6 b4 ~$ S! t) v/ E! |! X; Y% M %%( x$ r# H u, r* d, f% t! w filename = SST.mp4;! ]; q2 l ]# f. r fps=10; 9 K# r& E! i3 e( L, T WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象) B+ o% T; E9 p' a) R WriteObject.FrameRate=fps; ' T K0 x7 g% T! q' j7 P& @ Q7 Q. |5 g WriteObject.Quality=100;7 K# f; G9 G& a) G open(WriteObject); 3 Q/ W6 t' s& d6 f- C %%6 x4 V/ R3 ~3 y5 E4 C SY(1:5,1)=[1870 1901 1931 1961 1991];) S" R- n. f- W' p8 U; _6 D STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; + y! h; M6 _7 i1 ?% Z; W STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};' `/ k Q& d7 O5 _1 }' G5 F for m=4:19 a7 e1 h. u4 {+ O+ t9 F sy=2000+m; * n, ], f, X, [1 s str1=[HadISST1SST20,num2str(m,%02d)];+ V# {; B. r* f5 l2 _4 S str2=[SST20,num2str(m,%02d)]; [7 i! t1 }. z6 X SY(m+2,1)=sy;6 P& l( U# S( Q; j STR1(m+2,1)={str1};4 Q) Y* B3 O! F, p5 s2 B: u STR2(m+2,1)={str2}; * A5 w9 \& I' l, G3 B5 L end 6 n: F! d; j: M' S( u6 t9 Y( j SY(end)=2020; " ^) h' @' k! C& s) x STR1(end)={HadISST1SST1}; & b1 T8 X2 x6 m. g STR2(end)={SST2020};- m- o/ Y2 v5 [+ w & z; N6 b6 Z, z$ f: V [rowsize,~]=size(SY); u0 z* U# t- r3 w/ {2 T for i=1:rowsize8 e4 r$ o2 J0 g# i5 G( P( n shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)2 i2 p |, M) a' Q end ) _; a* A) p6 X1 {9 _* z* W6 e7 m2 w( k% y1 ?! @ hold off & D( s2 ?" k( _2 H' H close(WriteObject) ; G9 Q( P* X, k% K %% 7 J1 T2 S( J9 V* @8 ^( s5 U functioncbar()Tem=(-10:5:35); ! \2 O K; d% e, k labcell=cell(1,10); %用于存储colorbar标签& W/ L- e5 ~7 _, H for i=1:10 8 m2 S% X Q% t% }- Z8 h labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};4 N7 g+ j1 o. t* K6 P end # ^7 v7 R. R0 X cb=colorbar; ( g' r* r2 @/ Z" }4 N i7 @# k cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex % T3 ] j) N$ R8 ~- l cb.TickLabels=labcell;# D: H: X) S3 k$ @$ V! S cb.FontSize=12;# L% j( w4 n2 ?; Z! y8 F end 5 V3 { k# S/ P+ p4 W1 p+ a; F) g$ F% m4 ^ functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);& o( I, X7 f0 C- B& H2 H/ i) G eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句' o8 f7 ?+ q1 Y4 W n1=n1/181-1; %数据每181行是一个月的全球SST数据 ( H$ d1 k- q) Z5 s6 W9 J for i=0:n1$ U$ G/ @, O C eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);( a. g8 I4 k) ^$ u& C% { C(C==-32768)=NaN; : n4 B% Q; G' m9 D6 q7 e+ Y4 F set(im,CData,C); %更新im的CData属性8 @' i6 }5 p' I1 Q set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 4 \! `$ \6 `1 t: h4 N( [, W set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 3 @& M( O5 l7 y5 G/ {/ j/ s: }' `; L( b6 L" ` frame=getframe(gcf);4 ]& N6 {7 J* l G! ]+ F% J; c writeVideo(WriteObject,frame);0 z. k* g% J7 w end ) R$ ?. p1 S( \ eval([clear ,str1]); 0 @( M0 C2 w% m6 c end ) E6 _3 q9 i0 J* M$ r
6 U4 s3 a0 f) q0 m7 E! ^

效果图:

( e( @7 Z% f+ p- C
9 E3 m3 a# D y: A/ ?: K: n

数据来源网站:

3 e9 V0 k' C) B w) r 2 f* B. O; _$ y

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

) E0 m& y; D5 j3 v& w2 s/ m

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

3 m. i& R3 y) O. q2 t: V* A8 K; A/ j B6 ^# A4 T' U1 U: |- B

提取码8xt8。

2021.2.2更新

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

: K* ?9 u+ l: P1 B* [

参考文献:

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" J! W3 C4 G' d o5 t" Y% | ( {- s" ?; t4 Q6 a. o) d) R. e' J/ [" z, I1 { 6 b, H# I8 H d: p' q 2 Z2 T+ v4 n, t! n
回复

举报 使用道具

相关帖子

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