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

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

[复制链接]
0 h O( p1 J+ k

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

/ v% k) n2 i9 d/ u+ ?

matlab程序代码:

: w, q7 f8 J) c0 S0 U; {4 T
%对图窗属性进行初始化. q# b/ R5 u. z7 V1 }2 A" ^, N7 s figure1 = figure(1); %创建图窗并获取图窗句柄 # N5 g0 _ a" P% f$ L; z SIZE=get(0); %获取显示屏信息/ A, K; l; R# U# S set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小! W# b& a4 j, |8 ~ C=zeros(180,360); %预分配内存/ B) B, q; n! e$ I9 M' I SY=zeros(22,1); %用于存储每一份数据的起始年份, K$ ?. q5 _5 y: R, z STR1=cell(22,1); %用于存储变量名 0 B# E/ u7 Z `8 ?5 G" j4 D8 w7 } STR2=STR1; %%用于存储文件名8 a* B# C& Q9 o I; L1 A clim=[-1000,3500]; %设定imagesc的数值范围 0 Q4 T3 `* e; t7 b" |/ q im=imagesc(C,clim); %创建image初始对象 5 l) Z$ e9 W" s! I% {4 u colormap(jet); %指定颜色映射类型为jet 5 k x$ x+ F; u" H0 y, T" f txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份, N; e) c5 F+ {2 O/ k title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);2 L) B) c! _- B/ o0 G/ |% U' x; b axis off% H0 m5 [' f) b) [9 r hold on % ?4 w7 H! q3 |* ~$ Z cbar(); %显示预先设定的colorbar # X7 g* e8 O; i) @$ c' w %% 6 o! F' c4 ~. l/ U# ~" P filename = SST.mp4;* }; Z, f3 V3 H& O# U$ [3 T( D fps=10; 3 t ~8 y/ o9 J2 y9 d WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 2 a8 F, p0 w: T) q" n) r3 V WriteObject.FrameRate=fps;* f+ C& K* f4 \1 O# p* p WriteObject.Quality=100;9 N% T% {# W8 Y* C8 ]# w0 t open(WriteObject); 8 u/ G, g* u! `5 F! K %%5 M; u) C7 F8 ]- e SY(1:5,1)=[1870 1901 1931 1961 1991]; z& c) D4 Y6 x3 I STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};$ q9 J3 ] C# |1 j$ n3 U STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};, `* {3 m* d, a' C; K for m=4:19 + X# q4 \9 Z. E; v$ e sy=2000+m; u- i/ F/ ?" l) w$ V5 V str1=[HadISST1SST20,num2str(m,%02d)];$ O0 B$ z, m" H1 Z5 r+ @# ] str2=[SST20,num2str(m,%02d)];! l+ r1 v% J/ O7 R SY(m+2,1)=sy;1 r7 }2 i+ L0 U9 `! _& W STR1(m+2,1)={str1};' t6 ` Y/ W) U3 { STR2(m+2,1)={str2}; r$ [. B! T* w7 O9 q7 ` end" R$ a% h$ L0 V SY(end)=2020;9 S7 a# C; a; J6 l% z STR1(end)={HadISST1SST1};8 ~8 J- b9 O B" D- ]( K7 _ STR2(end)={SST2020}; ( |& \0 A: `* i3 Q2 ]6 U! Y) b6 K. e& [ n [rowsize,~]=size(SY); & S9 H' E$ g+ t# v for i=1:rowsize ; T2 {6 V* ?# o# g" k1 M9 ~ shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt). T; i7 u) d! C, r3 l end8 W% B/ o" S9 q! C9 K ; i3 K6 }9 V' u hold off% [: V$ ~4 Y1 X& ]5 \& ~1 W g close(WriteObject) 4 C3 V( g' s# V: b %%: z9 {) b# M& S functioncbar()Tem=(-10:5:35);# n/ N. D9 k9 @' ^: h" X labcell=cell(1,10); %用于存储colorbar标签 0 h/ {/ G4 e1 ~- f$ x for i=1:10 4 e$ c0 U0 p" D1 X& k labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};1 D& V& V6 q0 m& H end* Q% ^) |4 c' ^0 R0 f cb=colorbar; " H2 Q8 N0 t4 a0 m$ O/ Z" `& l cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex % b# L$ s9 ]9 L2 m8 Y cb.TickLabels=labcell;& _0 ~1 \& A! P% y% @" `0 p cb.FontSize=12;. k- f: _ n# q5 E- e end - r" a; E5 s5 \ % H' h" H8 X5 ~6 a% \ functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);; O9 _. J& T2 B eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句, R6 D6 j X: Y5 i. [ n1=n1/181-1; %数据每181行是一个月的全球SST数据* H4 O& f" H: w. S& K! T for i=0:n13 ]+ d; ^9 k& h/ c: q5 q* ~ eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);3 c9 h: }: x5 {# K5 H( k C(C==-32768)=NaN;4 Y; u/ h. a, s1 v0 ` set(im,CData,C); %更新im的CData属性+ W+ _# Q" g/ S1 S+ `' F set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 1 o* a! M* w: H. a7 W" n/ I8 V0 | set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本/ ^3 z. Y$ U3 `! r4 V# p1 l, B % o7 {0 p0 p8 m8 m: _9 v frame=getframe(gcf);7 B7 G; Z! W; g- V writeVideo(WriteObject,frame);% f+ w. y/ ]# f; a5 Z; G0 L end6 o$ w* }- Q1 n eval([clear ,str1]); ! H, ]/ K2 `) t# R, I5 X end ) k7 O0 d, T! {# x# [: `6 g! h4 Q
! e* Q( Z+ l4 r0 g: s; G6 b: T

效果图:

4 ?) {# `' g4 c" v, \3 l
0 {* |# [: `( t! a7 b7 X+ m

数据来源网站:

. [: X" e. s5 M* P' B9 h( m/ P( C 2 l3 x) k: X" K: a a, d; 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/)

% V6 r8 x! y/ I

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

- l1 P/ i( k2 s7 ^6 _9 W 5 k9 o2 |( n8 k% x

提取码8xt8。

2021.2.2更新

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

+ I ~. ]1 q% {' M! H7 H

参考文献:

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) {$ G6 p. n) ?, f) p $ h0 F- K* m9 o# ?7 }+ N4 z+ j0 x& f5 h8 {2 L" n2 u: t 1 ]9 U9 W. l$ X" j! F6 {% ` Z, O! Q& z. R4 J$ k! u0 n
回复

举报 使用道具

相关帖子

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