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

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

[复制链接]
5 Z! M( ?) h# B, e

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

% |( b s# M: _) C9 [; p @

matlab程序代码:

! M* X. C1 F/ n5 p2 M* R$ y0 ]1 O
%对图窗属性进行初始化 " v# V9 H9 k- L$ e# [ figure1 = figure(1); %创建图窗并获取图窗句柄 / L. O. T+ |' h SIZE=get(0); %获取显示屏信息 * D2 e; _% N9 V+ D0 ?+ V set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 7 ?. X& r& v% \1 k& e! W C=zeros(180,360); %预分配内存* y9 g2 n9 Q2 w8 L" P' c1 q- l SY=zeros(22,1); %用于存储每一份数据的起始年份+ j! P( ?2 F& `. h% p1 V5 y STR1=cell(22,1); %用于存储变量名2 }6 U' H3 |) m# E6 K9 c STR2=STR1; %%用于存储文件名# r* c# A' o) j clim=[-1000,3500]; %设定imagesc的数值范围 * V5 |7 D X1 z I9 l) ~2 { im=imagesc(C,clim); %创建image初始对象 % `( O" B- m& J9 r colormap(jet); %指定颜色映射类型为jet 6 {: ~! [6 |* H8 |: F txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份; @1 A( b; M! q; d5 o) w, B2 i title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);% }& g k" o5 w! o5 e+ k9 ` axis off 4 W- B# i4 @3 A; t' \' h8 z hold on, k/ Y/ Q8 m4 P cbar(); %显示预先设定的colorbar1 j9 }- {) D& o2 A8 u( C %% 4 M0 Z6 r# y# l filename = SST.mp4; * j. c& y+ X' m' g5 x8 L fps=10;6 m; Q2 c/ _( |: y/ M+ p' z' n$ u WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 " U- `0 p. i4 ~ v WriteObject.FrameRate=fps; 5 `! o9 y8 z* j" D6 I, J! B- q WriteObject.Quality=100;: W, ]* C7 H# y' K- o) m2 {; C open(WriteObject); " Z5 K8 ?! K: f2 j9 `5 A! L) m5 b %%0 k' D9 `4 p7 [2 p, Y SY(1:5,1)=[1870 1901 1931 1961 1991];& G! i- Z& n3 p/ }) @! }3 b. m STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; * l! `9 F* l4 H7 e g STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};, p) M! G/ w) `# b for m=4:19! ^: E4 H3 T& G0 q5 D sy=2000+m; % d9 q5 p; ~" @ str1=[HadISST1SST20,num2str(m,%02d)]; 5 Y) N& B0 W6 } str2=[SST20,num2str(m,%02d)]; 2 Z# r& W6 Q6 T* u2 q; |5 S SY(m+2,1)=sy;, h( _, M- q, U& d( Y4 X STR1(m+2,1)={str1}; : ~/ y& W; E3 g/ [8 j: K2 C STR2(m+2,1)={str2}; _5 d- D1 q: D! i7 g end 7 e4 w* Z2 `- g/ M SY(end)=2020;/ j* L) Y; {6 i% Z STR1(end)={HadISST1SST1}; . W+ {- X0 {* V! M7 ]1 a STR2(end)={SST2020}; ' q0 p1 H @, g# R! t" T9 k4 F) @- _: P$ I. B: A" u5 i [rowsize,~]=size(SY);# [+ V) @7 ]$ f3 o. k for i=1:rowsize/ I+ W6 m8 n$ E9 a shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt), ]! j8 X$ M6 D5 H. `7 ?' g end 4 z- }, F# P) Y: W# D* ^$ d( D4 d0 U: m3 | hold off4 [. l; Q$ `5 ]- W close(WriteObject) 4 z I/ c9 }7 L; J8 y %%) f$ {7 F7 r) v- X" K- c functioncbar()Tem=(-10:5:35);) E6 D+ ?: h8 E5 n; O+ _1 J labcell=cell(1,10); %用于存储colorbar标签0 k- D, N5 w2 j$ b% R/ D. I$ c for i=1:10$ u9 [) Q! Z" N. a labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; ( [& |, h% @' i7 d* W/ u end 1 `2 P8 f# }5 o4 h cb=colorbar;; j4 C3 U/ x) N I D' Z- X2 e1 E$ o cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex) O$ f% h* k" d, W cb.TickLabels=labcell; % e. C& J* W6 _( L5 l. o7 o. n cb.FontSize=12;3 R! @# [1 q7 g$ A end' u2 y) x% x0 P+ P 0 J$ U' F* @+ e; n functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);3 t) [4 T y7 e& j' j+ O eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句" j6 i2 R+ ]$ F% o9 R5 Z n1=n1/181-1; %数据每181行是一个月的全球SST数据 n+ j: W2 E* p* X' x- P0 ~' t for i=0:n1 " {/ `) g0 z6 y: y+ I* s/ M1 f7 y eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); 2 t0 r; m/ G! Y$ { C(C==-32768)=NaN;' ~7 S( G/ ]" r* e* j; q set(im,CData,C); %更新im的CData属性7 @1 c$ d9 a, @) X$ K set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度' H/ c. D! b7 T2 ]' M6 o set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本! x" k% H+ P+ T : l1 {3 s2 s, p y4 I1 G frame=getframe(gcf);. C9 W3 L2 f* C* Z, ~) ` writeVideo(WriteObject,frame);6 l" ~' i* T$ w, y2 p end: P5 k) j. j6 g. z Y eval([clear ,str1]); 8 J& n0 K' a4 P, y5 w end 9 @$ o8 S$ \7 r* R4 g
0 ]! u. Y; D' c1 K

效果图:

6 b- ?' L& A; |& l S* ?
, K$ o& {% S) [* [ p

数据来源网站:

; o, W' { v, q7 S o: h, W+ |& Z0 L7 P/ b& v/ 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/)

W! n8 u9 J6 x' `1 o/ P

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

$ s- I, y( g8 G7 I3 Z, h) T2 v $ p' ?1 T) [" Y8 o }0 C7 o: d: N3 ?

提取码8xt8。

2021.2.2更新

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

) x- r) _' D$ p3 [2 B

参考文献:

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/ c$ A* b( m6 k9 w $ d1 a2 Z5 q& q; S3 \# f" m9 w8 w5 f. G ( X- U+ W( D1 N8 c& \4 V* Q3 Y$ s6 J+ P ) [) S/ }$ C" s8 f: b6 V; f
回复

举报 使用道具

相关帖子

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