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

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

[复制链接]
) g r2 i8 K% E$ d6 L

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

" P0 T' a+ }3 W

matlab程序代码:

0 M4 z8 b1 t$ d3 c8 J
%对图窗属性进行初始化 - z: ^2 s/ c1 s, H0 O8 f6 [ figure1 = figure(1); %创建图窗并获取图窗句柄: D8 x/ N( n) f" {6 J$ o) ]# Z SIZE=get(0); %获取显示屏信息 ! H3 T; x4 |0 d0 k/ D$ E set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 # W, `( G. h9 H- ~* D0 L' R C=zeros(180,360); %预分配内存( \8 j& ?; M$ d4 r" i$ B# o6 u SY=zeros(22,1); %用于存储每一份数据的起始年份 9 v5 i+ t+ ~9 i STR1=cell(22,1); %用于存储变量名& C5 v! Z0 H! G, ~! E$ H! b STR2=STR1; %%用于存储文件名: ^8 Y( N# u/ `3 T( l clim=[-1000,3500]; %设定imagesc的数值范围 M0 ~, s7 s+ z+ \ im=imagesc(C,clim); %创建image初始对象 ' Y/ X4 z3 p0 _ colormap(jet); %指定颜色映射类型为jet. f6 Y6 s8 V1 w txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 ?8 A, I$ I) ~7 q$ x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);, r: Z) l0 L: l3 t/ `% r! B axis off 1 b# D0 h- X8 Z+ O hold on ) d1 d* T4 n1 B! P" H: _ cbar(); %显示预先设定的colorbar% b# N; v. ^7 t/ W %%# `( G" q3 Z4 V! j$ H filename = SST.mp4; 5 C Y4 {% L7 M+ L; a2 r- Z& q; j fps=10; 3 z+ K( R' V" @7 O' w WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 . ]: L- q7 U- o& t2 |5 \# F WriteObject.FrameRate=fps;7 N2 @5 ^/ w' l, r+ {5 J- ` WriteObject.Quality=100; % ?6 y2 a# [8 P# w open(WriteObject); : C. W7 p, j3 h %%% ~8 Q) j2 `5 c) G/ K; r SY(1:5,1)=[1870 1901 1931 1961 1991];" d7 r" f% H' D6 \3 K& R STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};5 @# N! r) j& } STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};; ?6 C" q1 c0 m: s for m=4:19 ) h. Y2 B: \. a' z" L. E9 L sy=2000+m; / {$ A; U& A6 I$ A, J7 i str1=[HadISST1SST20,num2str(m,%02d)]; ) R+ |- s, h+ L str2=[SST20,num2str(m,%02d)]; . d% k, j& o& N4 P. ` SY(m+2,1)=sy;% l6 w$ H4 v; O: }1 T/ j2 ] STR1(m+2,1)={str1}; ; ` [& n1 Y7 X" o( _0 O; E' m STR2(m+2,1)={str2}; c; P+ M5 N) ]/ H' c6 H end' |) j0 g6 I; A SY(end)=2020;0 J2 M8 o3 Q- u1 p5 |. x STR1(end)={HadISST1SST1}; 1 `1 F" R2 I7 f$ F" X+ f STR2(end)={SST2020}; & R. l# p+ z' H: y; B 3 j- q- T' p& A/ e; P( R( V [rowsize,~]=size(SY);- }- H# ]4 h' K; { for i=1:rowsize, Z8 r& X7 d* p" e1 y shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 8 z$ L4 ?+ `+ }& Q end7 W" |* Z! K2 j# J% p 7 h% J1 r* |9 B, ?7 H+ p8 Y hold off , B0 [0 i5 |# l. H0 @ close(WriteObject) 9 b( R9 g9 Y& q S8 O) q& I" Y %%# @% y* _$ T7 m8 N) X7 \ functioncbar()Tem=(-10:5:35); - b/ U: S* L4 [# q! Z labcell=cell(1,10); %用于存储colorbar标签 ! u" R6 D# A( Z, v( Z. Q6 K for i=1:107 K; ~1 {0 H# `7 v$ i) F labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; 4 }( w( o* {) H, X end r9 F9 ~4 f4 d& x/ O cb=colorbar;! [" I0 S- o# ^- L1 t cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex" j1 r$ |0 Z9 Z* T cb.TickLabels=labcell;8 A3 b0 }' f4 ^2 l# R4 y8 Y cb.FontSize=12; " S5 E9 d5 ~! t end / T0 u' A0 Z+ m, B1 x; [3 P 9 V9 q; q( l2 U5 t& C functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);# y8 Q2 H/ o K/ S) ` eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 0 Y; w/ e5 a, M% A n1=n1/181-1; %数据每181行是一个月的全球SST数据 % ~' u/ q; L! V( N/ g; b for i=0:n19 _2 D$ `2 i2 J! Z4 [, q, ~5 b% v eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);( o' U: j& K1 l2 t' U C(C==-32768)=NaN;1 j2 R- y8 i) D. v; t set(im,CData,C); %更新im的CData属性 3 y' F' ^% r: v* h' q* ? set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度6 Y- {% e% J$ K3 t8 T8 Q" V6 F5 i set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本$ u8 L% b5 V) S. z1 z: \ / d J& _5 f: a" g I8 ?0 F2 E; R% L frame=getframe(gcf);: b* p, k/ K" B- e8 M writeVideo(WriteObject,frame);, j2 I* F( r7 V+ S: p7 z1 V+ `+ n end ' c+ H/ [/ ^# \# Y9 Q% b G+ a2 } eval([clear ,str1]);) ^/ W( ?' b* t' S+ s& @ end! P- g: f7 b4 ^; u
9 a* K5 Y4 C% B* h# ` Z& [7 y- s/ T

效果图:

1 l3 D( T; L9 Z! w/ k8 E
) _/ B7 M- @% [0 @: Y

数据来源网站:

4 v( V: n% u d" } 7 h& J2 ?. }$ A- L, N

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

6 E0 g7 Z2 V# n

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

0 ~9 s) }2 n& P. h, U7 A/ Y' Y! c 0 G( a% V& J5 d, [, a: L6 u

提取码8xt8。

2021.2.2更新

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

Q+ d. X/ m) g* X2 c. S4 A

参考文献:

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 * y' V% ~1 e& E( `: k* v % n3 E' m; q* v- Q& i* B w- G! {6 R- G 5 h$ I/ k2 j3 d4 D& @ * K0 u3 |# p" P, }3 L9 j5 M2 R
回复

举报 使用道具

相关帖子

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