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

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

[复制链接]
3 f m& z( m1 Q+ f

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

$ c9 [0 @) \2 m/ e G) A9 ?9 ~

matlab程序代码:

' F8 Q! M, w' P4 g! I- {
%对图窗属性进行初始化. D+ y9 s& W7 h, b0 x: a- A figure1 = figure(1); %创建图窗并获取图窗句柄 " ^. w: G" E7 h3 U4 Y" L* \2 M SIZE=get(0); %获取显示屏信息 : B! c4 B4 T! ` set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 ( s) R% F8 |% O6 r" s( \+ c C=zeros(180,360); %预分配内存 - l5 ~/ l, |6 h- i/ q I/ C4 s SY=zeros(22,1); %用于存储每一份数据的起始年份 * K+ Y# ^) D3 R; y* y STR1=cell(22,1); %用于存储变量名8 F/ O- m0 P- g* \9 t' G6 [. G STR2=STR1; %%用于存储文件名 A0 A, c3 l, d. I6 X6 L* R clim=[-1000,3500]; %设定imagesc的数值范围 0 N4 {' P$ }5 Z' L: @% A im=imagesc(C,clim); %创建image初始对象 ! H1 `7 s4 S- ^ colormap(jet); %指定颜色映射类型为jet/ I5 @- K5 K3 |2 |* Q txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份( V& a9 Y; b! t3 L title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); & T( |7 X4 v# N9 D axis off & J. Y0 c2 o- a! b: H2 R+ ^; Q2 R hold on ( i; {9 H: X3 U/ U6 p: X cbar(); %显示预先设定的colorbar 6 s* v9 ~: Z8 r6 |4 ] %%3 T q+ u* p$ p0 F1 x* K/ M filename = SST.mp4; 9 {# q! f2 k# l4 `- L1 Y/ f fps=10; , O2 a) u% v# s! z+ M WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象0 }9 z: z# q* G8 d0 b* y8 d WriteObject.FrameRate=fps;* C4 G& C) o9 g! n, f WriteObject.Quality=100; ( ?4 L' _; @7 i( t) C0 ?% o# L open(WriteObject);( u g* c. f6 u' _8 p0 P %%- s) i1 C. m: L I SY(1:5,1)=[1870 1901 1931 1961 1991];$ E; q: a$ `9 b) S STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};# K' m7 z, T3 ^% {1 z1 k) p STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 4 A$ P, N4 j0 g& ]6 C) } for m=4:19! F5 w/ D7 ^, q, w3 z sy=2000+m; . ~5 E: H1 h5 F6 C str1=[HadISST1SST20,num2str(m,%02d)];% ~$ x, R% C7 F str2=[SST20,num2str(m,%02d)];0 L. n7 ~) `3 T5 B SY(m+2,1)=sy;- }# y8 I( R O& {& f0 } STR1(m+2,1)={str1}; 2 \4 d9 X# W0 T% N! ]6 `( T- s STR2(m+2,1)={str2};- f" b6 N) H1 i( u$ u* s/ _& {, Q end # X+ Q7 A4 \, S. w2 q7 y+ ^& l SY(end)=2020; 6 q5 y# r" R. o/ W8 s' | STR1(end)={HadISST1SST1}; A, r) C$ M7 M: K STR2(end)={SST2020}; 0 x6 C$ k/ }' m+ P1 p6 L/ D% b- [ ]8 t [rowsize,~]=size(SY); * J* U: D. {3 I0 O* R( M9 M$ b for i=1:rowsize/ I3 u' u# M; x shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)2 B1 r$ a/ o) l* Q0 L end6 j6 C4 n% G4 j4 N# |. d& J3 ]) t) H ' i4 V& d8 Q- n! H9 V4 w hold off# G' R5 K0 F9 \ close(WriteObject), i0 ~( I$ {" @! u! Q9 w2 w5 K %% . z% o7 c( }7 I' m( l l l functioncbar()Tem=(-10:5:35);3 c( |1 ~2 B( B/ E; |$ S8 a, P6 T labcell=cell(1,10); %用于存储colorbar标签 % g, O" X9 F+ [8 z for i=1:10( ~8 d/ C* G1 {& K3 W/ \- ~+ \( i labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};8 v9 v1 J7 g* m% M end! s- M9 U* C. a. U( C; i cb=colorbar; l. x& e! S+ D% ]8 w cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex + I% \* K6 m+ J2 _1 f cb.TickLabels=labcell; l5 b3 L8 H% f cb.FontSize=12;/ c8 _2 o6 H/ |/ r1 _& g end 8 `/ \0 T% ^/ u2 K; L1 }' _6 g' w, B: _% q h: W functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); - Q( L: g) j& n7 R/ y eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 - r" W e* d' b, S4 a+ o* ] n1=n1/181-1; %数据每181行是一个月的全球SST数据$ r0 y7 Q+ p! k) u' J for i=0:n1 & N% g$ |6 B% `8 l4 |; { |* O+ J1 ~ eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);) D! t! [1 x5 W. }/ D7 { C(C==-32768)=NaN;- _( n/ {' N' Y' E/ M$ } set(im,CData,C); %更新im的CData属性5 C! H! J+ u! B2 H set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 ! I4 k: x! r* i% c# i* q) ~1 y set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本% b+ x2 p6 t- v5 o3 ?+ G 3 s% x+ F* b0 g6 d9 F. p frame=getframe(gcf); 9 r) N7 X3 ~! q5 P* j; s/ Y writeVideo(WriteObject,frame);$ U8 L: A7 ^( L7 v1 t: M end6 [" v$ e! `2 j7 G/ T. c eval([clear ,str1]); - s; N W0 t: U3 O$ M0 k" g* R& P f+ o end/ z6 \0 B; `; t" g0 w
0 w+ T# l, G2 U3 P

效果图:

9 `) W; G, W, ^: O+ Z9 P* d
4 j1 t# b [+ V8 b+ [

数据来源网站:

4 t* k: T8 `6 W! W ` $ K4 @% `8 {8 w; M" E

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

. z% Q0 @% V5 z0 U/ G

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

( F* e1 W( n: \ $ P' k7 H; t' B6 p

提取码8xt8。

2021.2.2更新

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

2 ~/ F' _* q# N- q/ |

参考文献:

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& Z8 S: L; N7 _* C' |; r- ^; J : \* I( C9 c2 S, U. f' ?$ } 9 M7 A# `' L5 y0 [# u/ L6 O ; j6 ^2 [6 a9 ]. L7 ~ ( h+ e6 m. n8 u, d0 {" T! J
回复

举报 使用道具

相关帖子

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