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

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

[复制链接]
* a7 F$ M: h( Q3 G& _7 U' N4 t

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

* T1 i) G8 a* _. ^3 V( w

matlab程序代码:

f; c( E: X2 ]# H
%对图窗属性进行初始化) j) \% y* i% |: d. l% [4 L( `1 Z figure1 = figure(1); %创建图窗并获取图窗句柄 " E F! H/ L, G7 X- K8 K SIZE=get(0); %获取显示屏信息 + X1 n6 B# c, t8 i w9 L9 [ set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小0 A% P! a" F) O+ q C=zeros(180,360); %预分配内存3 ]# g3 Q' S9 f! |3 w! o! S SY=zeros(22,1); %用于存储每一份数据的起始年份 : T* `" g( f; K1 f. T, p STR1=cell(22,1); %用于存储变量名 c9 O/ u+ k9 ?' I8 D STR2=STR1; %%用于存储文件名 + }0 K. O3 i$ s8 W9 Z9 D- f clim=[-1000,3500]; %设定imagesc的数值范围* t4 j- Z3 D" F& p) r( w0 x im=imagesc(C,clim); %创建image初始对象/ g- a8 }- P. ?0 @7 c colormap(jet); %指定颜色映射类型为jet ' Z4 |4 M, D& ~6 }% f/ W txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份: _& N* T6 H8 f8 h title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);8 T0 C: d9 m& [& d2 Y axis off + F/ Q7 `' O4 f* Y# I7 [ hold on 1 a/ |/ d5 |& r, _7 U/ P cbar(); %显示预先设定的colorbar 0 L3 X6 D+ ^' j( \* h0 o4 V %% 8 q- E5 v$ \# ?$ x4 a$ {. b/ d6 [ filename = SST.mp4; % g6 ]( B8 H, ~4 M' X$ ^ fps=10; 1 R1 R) r7 n* i! ?# G+ x WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 " w1 t; |! o) C+ `- ?( \- ?" a5 v WriteObject.FrameRate=fps;5 V' a3 f9 ^: t5 b3 ] WriteObject.Quality=100; / x9 ]) V# m% `; R" s- e open(WriteObject);* n) z; T! ]: x1 f, g3 M- d %% / i8 J# a3 J2 O2 R. [ SY(1:5,1)=[1870 1901 1931 1961 1991]; 7 u1 U4 M. h& N( H2 { STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};' w5 D0 E. [" @) B3 c5 _( @- ^' i STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; # l; ]6 q4 p4 D- h for m=4:19 M! ~/ M+ W7 U sy=2000+m;6 x1 X: a4 z/ s. m/ \ str1=[HadISST1SST20,num2str(m,%02d)];! w( h- X9 V' X- q. L str2=[SST20,num2str(m,%02d)];/ _: J7 ]5 G* v SY(m+2,1)=sy; " {* E! W* ^( A5 G STR1(m+2,1)={str1}; 2 W- s, @ s0 o9 A( @ STR2(m+2,1)={str2}; 4 O u: U4 U( I& K+ ^ end + L4 M- z {& I1 @) n SY(end)=2020;9 y) d4 B4 M) R" j STR1(end)={HadISST1SST1};) s& F7 a" s% e8 c3 n# R, p3 Q* }- u STR2(end)={SST2020};% b5 r* S' H1 G+ U J6 C + U9 _# Y/ y2 d" q n6 [ [rowsize,~]=size(SY); $ d3 N) V+ V5 j: G4 v9 { for i=1:rowsize1 \, P8 |1 ~7 W0 K6 q0 r/ m shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)7 @# D7 Q9 m" [- H6 v& G, L end! M3 C7 d/ M2 O1 |3 } 8 j+ ~6 h7 _" y6 Z4 o6 _ hold off 7 a6 A5 a; z0 _( U3 X2 T: f close(WriteObject) $ u5 N) s# Q6 \6 U' J, ?5 j3 {5 y% l %%# Z% o. i+ e4 D functioncbar()Tem=(-10:5:35); , V# {2 }' J+ [& k labcell=cell(1,10); %用于存储colorbar标签) o' F7 W; H1 W. C for i=1:10) I0 Z! B0 ^' v Y7 \: S labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; ; {- W4 g/ W, x8 y end. j6 V4 |! u6 p6 w; j, F2 L cb=colorbar;/ v$ {/ z5 E3 z cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex / ^ T- ]2 k9 W" v6 ~ cb.TickLabels=labcell;5 @( g8 W7 i, }# O* M cb.FontSize=12; / g: P* J5 @& H' l5 c+ G end ( ?9 t0 \$ c0 i2 Z4 [3 l `8 C5 q' o, M7 R# S functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);. T, T$ I+ n% s eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句* t* T3 v- A* k/ N2 |# W n1=n1/181-1; %数据每181行是一个月的全球SST数据 : F( g2 \- H( M4 B for i=0:n1 4 L h7 U7 H5 k" b. W eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); 4 T6 Z) }0 C# p7 k9 n C(C==-32768)=NaN;3 h' I0 o% i( }9 \ set(im,CData,C); %更新im的CData属性 + f3 W0 i# b6 Z+ C0 P set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 6 l% X: d6 }+ [3 i, c: r) Z) { set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本; Y I8 d! F! r & \0 H! F* [3 M. t frame=getframe(gcf);! D) J3 e; z( A3 q writeVideo(WriteObject,frame);$ [1 w+ S% d, q2 I z7 S end ; k. U2 f# z2 T& X- u eval([clear ,str1]); , n2 s9 o; N) N& R" h end/ `, g. D" c5 H$ P) S
. U" a7 A* S! J, e J

效果图:

% C4 q& }% u# [+ R" Q
% i2 b A3 t! J3 b% M: h

数据来源网站:

% H' ]& E8 Q# E# _* q $ w1 K$ y" e* Q b6 F% A

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

7 V' G$ N9 I# B, a, o) Q

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

% x. R7 @3 W0 x0 ?# u& e" t 5 m) _8 s+ t, f! Q1 m! ^8 ~: \

提取码8xt8。

2021.2.2更新

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

6 N. K( a) F# d# U- K4 R

参考文献:

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. t' I+ L2 ^: ]0 P | % |9 h! D" k9 ?$ ]) K2 o( z7 G0 K+ e) L2 B, s9 w/ o 0 @5 V6 I: E3 _: W, p 4 q/ `% Z( H4 u& `( O3 D
回复

举报 使用道具

相关帖子

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