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

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

[复制链接]
% I& V% Q0 D( ?

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

; ]( c* X) Y( d* B! I8 I, L: o5 |

matlab程序代码:

% Y' N" h% ~" |3 r9 O- F0 G
%对图窗属性进行初始化9 l& s# l6 Z5 n* e figure1 = figure(1); %创建图窗并获取图窗句柄 % G. q1 @& _, W r" m1 X2 `+ V A SIZE=get(0); %获取显示屏信息' ]- z. P% y; [* ] set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 6 E3 t& G& I- a C=zeros(180,360); %预分配内存3 q0 y1 v' V( f2 y7 j3 d SY=zeros(22,1); %用于存储每一份数据的起始年份, Y4 N& a. \9 j# Q' R STR1=cell(22,1); %用于存储变量名 % v; I( L7 m9 Q, ^8 B' Z1 \ STR2=STR1; %%用于存储文件名 7 w! G, F- N; v% n! H clim=[-1000,3500]; %设定imagesc的数值范围# j5 x& F* T5 d- c( b4 z: D im=imagesc(C,clim); %创建image初始对象- T9 N/ ?4 i; } colormap(jet); %指定颜色映射类型为jet" s( Z: p) w# D5 [( g; | txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 1 o3 g2 B3 U+ J# s- x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); * o& r7 L/ h( s! i9 G6 R7 J4 b axis off/ k4 v( I, e5 G* o( a4 S$ @/ m2 i hold on & U% L5 }- S d9 H. `8 s9 D# k cbar(); %显示预先设定的colorbar . W* V# I; V/ h. A( k# S! i %% # E- n; ^: Y X8 _ filename = SST.mp4;; j9 w! n. Y* A# r fps=10;( H/ {/ \, c/ b4 A WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 . R+ l4 d# P8 W2 _1 m+ B# Y( D WriteObject.FrameRate=fps; * b6 F; F n6 }: R6 k: k+ i WriteObject.Quality=100; $ }# K$ A- e5 o8 _" n) t' N open(WriteObject); / A; {. G( b, [ R %%; \* l, J- U$ i( T SY(1:5,1)=[1870 1901 1931 1961 1991];$ v3 U F; b$ l2 }& _2 M8 m STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};3 e1 j* B; C3 q+ M: [, O2 Z STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 6 [/ ~% v5 z' B- [ for m=4:192 J' Q" b% ~# L# {/ K0 Z" _/ i sy=2000+m;1 v8 v2 \5 a, R3 o8 w str1=[HadISST1SST20,num2str(m,%02d)];' ]( U$ t/ `! f3 B; s str2=[SST20,num2str(m,%02d)]; # d( h1 x% p) n SY(m+2,1)=sy;" P. f0 D# x& y6 t STR1(m+2,1)={str1};( o' ~% E6 A- e S STR2(m+2,1)={str2}; % o" F* e S1 a6 @: K3 S) L- g/ g; I end \- e( p/ m8 X SY(end)=2020;6 B( ?$ L4 h N% K) \ STR1(end)={HadISST1SST1};7 t. e8 q1 F5 n+ U6 Y1 n STR2(end)={SST2020}; 7 W- E) @) `3 m: M8 E4 t3 g8 I , R0 c% {/ l5 n% X$ e* x# y! T% ~ [rowsize,~]=size(SY);* r2 o8 R- m) H' o8 h for i=1:rowsize3 |, o$ ^6 ]1 @6 B" s! e2 J shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 2 Z& B% {4 b3 t9 ~# ]* u end9 c' i9 ^) H' E* I. ] ' k) V, @) C1 A& h hold off2 F% p& z$ C6 t$ d+ g7 l close(WriteObject)) p3 j8 V. h, V$ S %%1 Y' s7 K! W$ u2 s4 v& l functioncbar()Tem=(-10:5:35);' I0 G4 d, s( D" G' w" c, Y labcell=cell(1,10); %用于存储colorbar标签% S+ O7 M9 N8 ^9 M, w3 \/ P+ B8 I, u) x for i=1:10 . F- j2 R7 i x, v1 z0 Z7 ^7 ~ labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};3 |3 G. r ]6 o j7 P( q' D. k end : G6 [( O% T! q$ h; N/ d0 J cb=colorbar; : ]) g) ?8 ?' s6 P cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex0 @ U9 j1 u+ _0 o cb.TickLabels=labcell;6 F! c% W) R" Y7 x cb.FontSize=12; 7 c- K4 _! X$ h& V% n. ]. V) N end - O/ b3 O7 V( a d- m) J; f' x0 K8 @ functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);& c2 B: ]" A& ^$ T: s eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 9 u( z' o9 G- w n1=n1/181-1; %数据每181行是一个月的全球SST数据 ; H `" i( r" B for i=0:n1 G% c% E8 w. V eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);! _: L9 _& L, U2 C; C/ W C(C==-32768)=NaN;4 F3 D! u) m$ X- ^$ t; Q set(im,CData,C); %更新im的CData属性/ a) l; r6 Z$ q# L4 s set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 9 p7 ]( n) l# C set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 # _3 @& H; G) V ] " s7 c: q. G( v8 T* |0 L1 a5 A7 I frame=getframe(gcf); 9 G9 `9 \* y2 l g+ k1 \ writeVideo(WriteObject,frame); 4 Q) C) [0 w4 r; r) |; Z+ z2 f* c end ( N, V) h' }9 Z6 ?! ^* @( i eval([clear ,str1]);6 e# U4 F- }" f/ z5 T end ' |- v4 m; K' h
) ~' [% X9 w& q# }" ^ |( \0 v

效果图:

- j0 t: m5 U5 J3 \' a& ]
* X0 f- A' M6 r3 I

数据来源网站:

0 Z% H3 O* {2 G- s7 | . _* C) N( i+ u) E. K3 j( s

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

: T1 t6 U- x7 `( ~, [3 I

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

0 ?9 v4 c9 c: K3 A* c+ l) i& B6 ^ $ [ }' w5 v- @" f o5 M

提取码8xt8。

2021.2.2更新

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

. P, P! c( ]! @6 h2 k

参考文献:

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: _9 `9 ?! P$ f1 U ! h# k @% g4 O. Q4 I0 q - W6 Q& P8 }& l a) t$ { Y 2 v0 G( ?) D8 {. N) O3 F( i8 p7 ~3 P9 l' H7 x- x+ ? u
回复

举报 使用道具

相关帖子

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