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

[复制链接]
5 c6 |5 |1 |% O

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

* m, d" ` m- K. ~8 B* } T3 a0 Z+ \& o" U

matlab程序代码:

/ r% Q0 S9 C5 M9 G, m
%对图窗属性进行初始化 . U) R. t w: I2 g: Y5 ` p7 M figure1 = figure(1); %创建图窗并获取图窗句柄8 { c Q$ _; G2 R, i5 ~ SIZE=get(0); %获取显示屏信息+ v0 ~) `+ q& Q0 P set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 0 U7 C. L" y! `& ~' z) o C=zeros(180,360); %预分配内存 ( }( g' J% i, m0 ]& Q SY=zeros(22,1); %用于存储每一份数据的起始年份( r* O( h8 S8 k. R# T" R( L2 {4 ^ STR1=cell(22,1); %用于存储变量名1 O, q1 O1 E; S! ?9 W7 x8 u$ Z STR2=STR1; %%用于存储文件名 $ N/ z$ ^/ Y e4 m2 B. v1 y( O } clim=[-1000,3500]; %设定imagesc的数值范围 $ \6 ]! ^8 L. d, p3 d; v im=imagesc(C,clim); %创建image初始对象 6 B5 {' J& T0 [8 B8 N4 C colormap(jet); %指定颜色映射类型为jet & o6 Z# R& _* U9 X' y9 Y6 x/ V, w txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 % y- A; d: ]* j7 G& _+ Y title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);! T& Q3 b2 M+ H+ X6 \* f t axis off 9 t# M: z1 e4 s* `- f0 V9 j hold on7 B5 I" n2 S/ ?3 G( X. ]' Y% Y# G cbar(); %显示预先设定的colorbar. O4 k ~# v# O8 z# i: m* \ %% % ]# s' j2 o* P- u" h' h! h filename = SST.mp4;9 H3 X, }& p6 T5 A- z1 v fps=10; 2 y; l! @ R0 @/ M! g { WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象9 t5 u' [! K9 J WriteObject.FrameRate=fps;( J0 J$ s& ^0 |: C) g( W WriteObject.Quality=100; . E+ z E( L$ p" B R open(WriteObject); 7 Z2 x. R/ e3 O; L4 f v& I %%) m) T( ?! C0 N/ |( @" @1 S SY(1:5,1)=[1870 1901 1931 1961 1991]; 5 F- ^- c. e$ U0 z* ?4 K STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};! v( B0 R& U T$ Z) q. u( L' j STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 3 b) V0 G5 o. d1 H2 ?$ V1 O for m=4:19 C7 O; ?- W( K' k- b1 Z# W$ J sy=2000+m; " g# a9 t! x0 r/ p str1=[HadISST1SST20,num2str(m,%02d)]; 0 b Q% {% o* H8 }& G5 U; V$ g str2=[SST20,num2str(m,%02d)]; $ z8 K ^: ^$ a" _2 i5 c1 ^ SY(m+2,1)=sy;: W/ J3 z1 R# B/ k4 H% g STR1(m+2,1)={str1}; 5 I0 V( k: q9 ]% O9 e STR2(m+2,1)={str2}; 9 q0 W. c* B* z* P$ z5 l end$ i" q# x1 g% u* |- F3 g SY(end)=2020; ( i8 o4 w8 {3 D$ C' _ STR1(end)={HadISST1SST1}; # {# N, G4 X% F STR2(end)={SST2020}; 1 _* s: I/ [% k3 N/ M `. |* `, C( f2 |1 M& h3 K [rowsize,~]=size(SY); + I- j- ^" [& w4 Z for i=1:rowsize+ e7 `9 |- g% K) h; n, K% j shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 7 \3 c4 m( x4 n e end 5 D1 m5 d# P$ R6 G3 G4 Z4 O 2 Z, a9 @8 Q& M1 ]" e$ w5 N$ [$ M* x hold off ! G1 p. p1 j3 C E' o& ~ close(WriteObject) 6 Q: m' A! Q9 p# i& t9 m %% ! v+ S8 F9 |: P G% E functioncbar()Tem=(-10:5:35);$ j8 \* b5 L- d/ e labcell=cell(1,10); %用于存储colorbar标签+ a7 B9 R* p/ Z" f9 F5 m/ M for i=1:10; q0 Q- D) m% n9 m6 C! p, Q labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};8 h2 ~- q5 a. P0 o# v4 o6 x0 a end5 K& t; k6 P* o; O8 v cb=colorbar; % B& k% @# e: [. k cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex5 p, r5 S; f/ ^. ?, s cb.TickLabels=labcell;" I0 x7 n6 N" v+ P; D- ^ cb.FontSize=12; * z k0 O3 r6 Q4 d( Q end - k9 F; b4 d: F( {% ?( ~. O7 D8 w" T$ W: J' Z& k functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);% A# A& u! a6 e eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句: ?$ c& [6 E K n1=n1/181-1; %数据每181行是一个月的全球SST数据 - Z# N. t- ]6 F" y2 o$ F0 [% C for i=0:n1/ o2 |* S* d2 |6 a; b+ u5 B eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);& F D( B" G9 Z C(C==-32768)=NaN;. V, I2 v: C1 v% P set(im,CData,C); %更新im的CData属性9 Z/ K3 x8 J( @2 z# E, j set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 ' J; N/ W& \% O4 j* Q. f* [ set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本& d5 H, \$ c9 T% c, Z+ X , w* F1 t2 R( k' G( Q3 S/ n) P frame=getframe(gcf);: ?2 M8 s; N* b8 ]; k* d$ z8 V writeVideo(WriteObject,frame);0 n( b" q0 q- v" W' p end# A7 k ?" H( g; Q) ^% v; d4 i eval([clear ,str1]); 9 X/ o% D# h9 V' Y _2 `8 G4 b end + d2 m7 z% X" V, s1 c; [
) r* g' j' h1 r! q" [- @

效果图:

5 K8 n/ U' C* G+ n9 K* x z0 J6 W
2 I8 b9 v3 g* d) c5 t% M4 B

数据来源网站:

" @7 z' S+ k& T( s0 [9 x7 { ) a7 \6 y" T$ Z0 Y. z: B/ F

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

' [" C) j$ _* ^ d; j

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

' ^# \4 M% e( V0 n* {. j + {: Z) D% S1 w: s' C

提取码8xt8。

2021.2.2更新

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

8 u2 {5 p& d. C, ?( K# 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; e$ B( v3 l& J4 |' |! E 7 J5 K( h1 ~) W 9 H$ F: A# [, c5 m, p0 K2 {: M8 L! Z6 n3 f2 z/ I3 l8 C1 T% h # l5 ]2 `% N7 I
回复

举报 使用道具

相关帖子

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