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

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

[复制链接]
: r1 j* p2 G. v. D( l

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

3 t4 h( H5 E6 a6 Q

matlab程序代码:

" B( z+ f4 J* m4 g9 @0 @
%对图窗属性进行初始化( x9 ?5 r4 T( b figure1 = figure(1); %创建图窗并获取图窗句柄 0 I: _' i9 B" J% {: A" i, G4 { SIZE=get(0); %获取显示屏信息 1 M% d8 l$ f4 c$ R5 s' _ set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小9 N3 A6 Z2 W+ A1 Z+ f2 g C=zeros(180,360); %预分配内存 % k X' N: \! V8 f$ { SY=zeros(22,1); %用于存储每一份数据的起始年份6 X: z: { b2 T6 n( |* o! m& _9 z STR1=cell(22,1); %用于存储变量名 $ n7 z' M% r3 M, w4 z: V, q: H STR2=STR1; %%用于存储文件名 6 @* ~3 Q- x! Q' `, H" E6 g clim=[-1000,3500]; %设定imagesc的数值范围 4 V/ g% x# w# R- m8 d im=imagesc(C,clim); %创建image初始对象 6 F# R1 v( y( M; l) y4 Q colormap(jet); %指定颜色映射类型为jet5 V$ k% u* {/ B" O txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 ' }3 d8 C; Q6 u, J6 I title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); % \; c! x# |6 ?/ o: G# C+ H, X axis off, Q4 n- j) `4 I: p7 z hold on ( w( K( k0 |3 e% }2 a cbar(); %显示预先设定的colorbar / n% x- X2 F' J& y %% ( G# I+ j/ L/ I) X filename = SST.mp4;8 Z& o4 Q5 W/ K! @- f: v, J fps=10; ( x$ q! u4 n7 Y: d1 u WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 4 V9 ~; w m z; A3 d* Z5 D WriteObject.FrameRate=fps;& g; o! |- U i* n8 N2 P WriteObject.Quality=100; ! _+ s# k; U; s5 W# v7 d3 l# d open(WriteObject); 9 n+ V2 p* d* ]% D, _ l, _ %%" i6 R; S6 q3 l( ~+ h: `+ Y. w SY(1:5,1)=[1870 1901 1931 1961 1991];% }7 B' L( Y; A1 h+ \: v, }3 w STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};# y# d: Q9 G4 q% I9 E* k% M STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; + ?& z, n6 _& }, i) y for m=4:19 ( g1 V/ M* f4 T l5 |3 Z sy=2000+m;3 s6 S0 e, f# J3 @+ q" m$ r str1=[HadISST1SST20,num2str(m,%02d)];1 `- Z2 ^- F% W I8 r str2=[SST20,num2str(m,%02d)]; M6 e# U& X) _2 Z9 I SY(m+2,1)=sy; * I( i" o: f8 m( c STR1(m+2,1)={str1}; # ~0 e, J& K! h1 [9 U3 j STR2(m+2,1)={str2};8 C$ \# I6 K/ Y: V9 T+ C end 5 _" ^5 l9 ?; \3 L SY(end)=2020;6 V* k" `9 I9 [2 f( T STR1(end)={HadISST1SST1}; / q4 Q4 ~* v' R/ u, z) ^! T STR2(end)={SST2020};% @! X8 Q5 {6 L, J+ f5 \' ]. f$ D6 r4 J 9 u5 m9 F! [, x: Y3 n5 o [rowsize,~]=size(SY);2 w) h: n1 n+ | M u for i=1:rowsize ) V+ T E0 K, S$ R L shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)1 k! R2 o5 [$ d4 ^+ _& U' } end + n1 u8 y' V" a8 o% K0 N x5 x$ a, L: w7 J% c; T. h- i- u- q) Y# S( C hold off / U( s2 z. F3 F: s8 i close(WriteObject) L) r* n; a7 `' ^+ l) w# S# ~ %%- x" @& }0 p2 d% b x T4 E$ u functioncbar()Tem=(-10:5:35); # f- w8 k. b' g/ a labcell=cell(1,10); %用于存储colorbar标签) n+ a4 B. U; O6 t. k5 \ for i=1:10 " l- u! `. P( T# c f: z# y& x labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; % e( W9 R2 V0 I1 Y3 \- E3 {9 R end ' q! b F1 n: f7 ?( j: u0 ?/ M cb=colorbar; + Q7 @: w: y7 ^' [ cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex ~: @( f+ V' g2 h cb.TickLabels=labcell;' Z0 s" }: s7 r U cb.FontSize=12;7 A: P' a2 _( r3 l \. X* n1 v- _ end3 D% m: E1 ^; n. n! G : V8 T3 ? v5 u) f. G, W functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);+ ?! ~* p* w2 e& K9 S8 D$ `) p, I eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 , e) M. i: P9 P3 w0 q0 C# R n1=n1/181-1; %数据每181行是一个月的全球SST数据 3 E: U/ l5 L- m! b, G7 G" t7 r for i=0:n1 : \5 \# j' E( O6 S eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); 1 ~4 x. ]" F0 b! s* j3 ^) G1 o0 U. k* } C(C==-32768)=NaN;1 u. o$ N1 i" e/ C set(im,CData,C); %更新im的CData属性" {6 @" l/ {) e' S1 M: w set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度: i$ ]2 b2 M' g set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本+ U( l+ h h5 K& _! `* O 6 C+ [" q, A! `- s# c frame=getframe(gcf);1 Q$ J2 H) U) q: N2 K! q writeVideo(WriteObject,frame); / R7 x3 t/ b; C* h$ K, S end; r; R: I+ j( x, k0 X1 J8 `1 m eval([clear ,str1]);& v" y* f2 G- e# X9 u+ h9 R end" L7 _% }# ~9 p8 ^2 j7 p* k s
) q! r- {" X( Q$ s W# @: J

效果图:

- T0 B: A; C1 V% Z+ ~
2 [9 ]6 A6 t( o. @$ L

数据来源网站:

+ ?$ y" ^# K: ~: P ) [9 G, b# |: O' \' V+ i

(引用声明: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 G% J: d5 u$ u: |( e m( p

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

: h7 U6 Q2 @) W: B! H 4 L' I" i% X( N' h9 X& o: y( o: \6 T

提取码8xt8。

2021.2.2更新

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

$ |! U9 w% ?# t+ m( n& h3 G

参考文献:

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 ; S* j6 q$ d, I8 |" o! N0 J) q / F2 G& R( i3 i2 S + u2 C, a: Z% @, P& f6 p: w# A e& h) D! F. o) B+ G8 C+ C" }" C6 t3 x b/ H3 [/ I, y/ j7 S( T
回复

举报 使用道具

相关帖子

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