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

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

[复制链接]
R5 T1 r. U W: D% P' c' R ]

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

9 h+ _$ }" Q( Y( `8 z1 i

matlab程序代码:

; ]0 d* {4 W; a1 W% @
%对图窗属性进行初始化/ x C7 [& U) H. {' @7 y figure1 = figure(1); %创建图窗并获取图窗句柄6 b( C6 b6 {0 \6 I SIZE=get(0); %获取显示屏信息 ; Y* n3 l8 x) Q# C. J set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小* k* K( D) a Q4 |1 ^9 E/ b( Z1 i& P' c C=zeros(180,360); %预分配内存 # T+ F+ x3 }: I7 t SY=zeros(22,1); %用于存储每一份数据的起始年份 4 W, ~6 b1 o! i* U STR1=cell(22,1); %用于存储变量名 ' S/ J8 P! f" G0 p$ L% W: e' B/ |# C STR2=STR1; %%用于存储文件名 4 p$ {$ ~3 ^( c clim=[-1000,3500]; %设定imagesc的数值范围 g. ]0 N7 T V1 h+ F5 ^! L im=imagesc(C,clim); %创建image初始对象) k4 K5 g! M, D' o4 d/ V* b$ a' ~ D colormap(jet); %指定颜色映射类型为jet - @. W+ q% e+ G3 ~, f txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份9 ^8 ?0 p- w0 ^ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); % q# ~& g7 o, s1 m3 X axis off ) e1 I8 F5 H0 y. W ? hold on # O, `' u _& B2 ~+ v- j cbar(); %显示预先设定的colorbar - D+ @& \' O0 S& {" a %%/ z; p7 r7 S$ l; d filename = SST.mp4;: @" ?7 g$ H) v) H0 P$ C fps=10;1 c0 r- n; p/ F/ q+ A/ W WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 S: `( x$ @" J9 K WriteObject.FrameRate=fps; ( j$ I6 o& E3 ^7 U WriteObject.Quality=100;+ p, V6 p0 S9 D- m4 l4 x) @3 H! K5 `& k open(WriteObject);( N0 X) a# } D: X' M- m %% . q7 h- A) |# t3 q# G+ o( ^/ N. e* X SY(1:5,1)=[1870 1901 1931 1961 1991];; B! d, f; X- g& e* F! _- X/ v STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; 8 R* v6 `& c4 s. ^1 }& w STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};1 J1 U, N) S. G5 Q for m=4:198 d, u3 q8 R6 J& o sy=2000+m; 7 u' P( e/ f, t" A str1=[HadISST1SST20,num2str(m,%02d)]; , D6 o) H Y; A5 Q/ v3 T. e1 t; a str2=[SST20,num2str(m,%02d)]; ( J/ o& j; l/ g SY(m+2,1)=sy;, q2 g3 i! W( |1 ^9 ~- B STR1(m+2,1)={str1};! q8 G( d' [9 R* X6 H" b STR2(m+2,1)={str2};& B" P1 U1 K* l# q end 6 K4 ~2 i$ y$ c) T$ J A+ K SY(end)=2020;0 b3 L5 V2 l/ ]% \$ q8 K STR1(end)={HadISST1SST1};. d& h- A0 @( c& ~ STR2(end)={SST2020};% x6 d2 M) H, t" k# a$ B3 S 3 P `! {2 s- R9 | [rowsize,~]=size(SY); 7 _4 z: U) {9 j, B2 c; G5 V for i=1:rowsize ! l3 H5 b$ N5 D, s1 E1 Q shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 9 G9 R4 o$ Y4 l end* R1 R9 o) ?& P$ _( H+ H/ x 0 c& P* q b( ~/ j# V, P+ D/ v hold off % c. g- d7 {/ a- R. `4 i* ` close(WriteObject)0 u. u5 _6 U3 M- D. n$ B2 f %%6 R8 X0 b0 P$ @" }* j functioncbar()Tem=(-10:5:35); # O5 T1 g' v9 b" O5 E' o0 k labcell=cell(1,10); %用于存储colorbar标签 8 J; L2 i& j6 H! ?8 e" K: p for i=1:10 T6 T0 D, F' F0 m labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; 5 Z9 s7 u) ^! \1 O: J: {/ H end' Z6 H0 d1 i" c5 T/ f/ v cb=colorbar; + X! H3 e/ B% k' S cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex + R A8 Z: L. A& v6 o1 l. H5 W cb.TickLabels=labcell;) A6 a$ E) b2 Y+ S cb.FontSize=12;. [" \3 X4 o0 Z; K" t end - s* w% l6 W- r C% n- S" z# \/ c4 ]( K functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); % c7 \4 i0 C' L! s5 d* I eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句# T4 F5 ~! H" z n1=n1/181-1; %数据每181行是一个月的全球SST数据$ @, Z# G, `0 g' x4 } for i=0:n1& M- y1 ^6 u- S. Y% \* M, l* _ eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);! }' N8 v8 G1 A! a4 s% b C(C==-32768)=NaN;6 n% B( I8 }; N! T6 j$ e set(im,CData,C); %更新im的CData属性. ?6 {3 J& @* x set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度6 p4 Q, y( }. W) O8 k$ n set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本' V+ A9 p! z4 p* U$ z: n( @ ' K4 P* x, I! ~ frame=getframe(gcf); 6 H' S8 `/ U' z& s. Q9 [, C/ ^ writeVideo(WriteObject,frame);3 ?% @& f. }, B' o3 l1 q9 w end! \2 i" I, B# W, G1 b1 U3 ^2 y( _ eval([clear ,str1]);$ V# k2 d5 e/ g; }8 K, a$ y end . c% d1 D# m9 t* }) N- ?1 n, _
! M! z9 z; r/ S0 @1 W+ }

效果图:

) b3 x- p1 G' f1 c- D; G4 C
4 \/ d: P6 f" t( Z+ v

数据来源网站:

. Q% G$ r1 K9 \* |, N# S 6 F5 z: m" |: p

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

: |; z/ \$ f1 G* ?3 N. j# T: [

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

5 z7 r8 g$ c! E6 P# w/ k/ r* W+ z3 G 7 s3 ]2 g; H2 w9 ?" |0 c

提取码8xt8。

2021.2.2更新

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

* E7 H1 ]5 M7 e1 D: J5 t9 P" 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 - u: p0 m/ g0 I$ v! v# Y$ t/ b2 r7 B+ O6 j; i% V0 Q1 O- ~1 R R# r) O5 w% Q6 k3 |4 E1 p& E4 p3 x3 _" i( i * L8 t2 F' {) \
回复

举报 使用道具

相关帖子

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