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

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

[复制链接]
% f7 I/ [4 d `2 y

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

8 u9 n+ B8 z6 q# w4 D

matlab程序代码:

3 R& N5 K1 a/ _" K
%对图窗属性进行初始化 7 |& u) S# ], ~3 w figure1 = figure(1); %创建图窗并获取图窗句柄! c. s, V n9 Y* ]8 W! S+ h, l SIZE=get(0); %获取显示屏信息 $ t3 I9 U1 A! ]; X% y set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小$ e# e3 A5 V3 s, M C=zeros(180,360); %预分配内存" q6 |9 N( s) w9 D7 m4 T SY=zeros(22,1); %用于存储每一份数据的起始年份 / @8 X0 t7 U1 Q. O+ n STR1=cell(22,1); %用于存储变量名) u# O! h. S: R7 ]! x6 @! }% S0 [, | STR2=STR1; %%用于存储文件名 U3 v7 B9 N# Z+ Y0 @ clim=[-1000,3500]; %设定imagesc的数值范围8 Y+ ?: T* `/ g% f9 \! V3 Y5 N im=imagesc(C,clim); %创建image初始对象 + u/ k! e$ f8 n) L" p7 G! ] colormap(jet); %指定颜色映射类型为jet* N0 S* Q1 f( u7 m& N- h$ L txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 9 h0 E& X8 e5 Z+ K3 x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); 1 a4 h$ `# S; i! a axis off : X( d( |2 a7 j7 K ? hold on * i3 f! N: k4 f! E; q cbar(); %显示预先设定的colorbar* J8 d7 |/ v, X- } %%* e, h8 T: U- m- Z5 {5 v filename = SST.mp4; ) q- W2 S+ i: i7 w2 Z W5 C8 P fps=10;5 d8 L( T: c8 Q7 g WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象" n, s, R1 a0 m, t WriteObject.FrameRate=fps; ' H% z8 G+ W% z; Q. w( S6 S WriteObject.Quality=100; " i4 L. h5 y6 r# `/ G open(WriteObject); X% x4 I- V) t% x% V1 | %% " k; T; S; i0 q9 x0 g6 H# F* n SY(1:5,1)=[1870 1901 1931 1961 1991];2 t% r+ a# Z, I STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; ~+ e. }, a! c9 \; w STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};8 D B4 V/ \9 | for m=4:19 6 s/ X6 ?, p, \$ z1 [% F sy=2000+m;0 R/ X: i6 A6 \* O str1=[HadISST1SST20,num2str(m,%02d)]; . Q* H3 i! ]. T4 f) U( e. Z str2=[SST20,num2str(m,%02d)]; 8 V6 Y% F* T% ~ SY(m+2,1)=sy;- ~/ B" j8 s# r7 q" H) W9 b STR1(m+2,1)={str1}; # D) a; v3 }/ X" ^. E/ @ STR2(m+2,1)={str2};) G8 @! _) H+ T end0 d% R# _) A$ i$ C3 q' u4 n6 Z SY(end)=2020; X& ?8 G9 ~. Z" z STR1(end)={HadISST1SST1}; ) b( _) Q0 D. t! h! F, E. B STR2(end)={SST2020};# ]- p9 j7 [, h # u$ o; K( @0 M+ ~4 B [rowsize,~]=size(SY);" f7 Q/ ~; {4 @5 ~. g for i=1:rowsize - \! E2 W, y0 F/ I0 W shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 2 E, j" y9 N1 l U! ` end, J" ~3 Q! t8 z; A, z5 a 9 l+ K) s: l/ H! }! S0 z W! m0 c, g hold off5 M, d! n6 K0 D7 w V# a close(WriteObject) , H5 A3 X6 S0 \% j' M/ o" o %% " h$ v5 e( `5 U8 d2 h- Z# s functioncbar()Tem=(-10:5:35); : k& T$ q: n/ [2 g, l6 }6 [; o labcell=cell(1,10); %用于存储colorbar标签 " C* d) S# m9 Z* `0 Y& ]0 e for i=1:10, g1 E# p7 m4 x% b labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; 4 b, A$ x l+ } end 9 v6 ]5 M# P6 K! S+ f) d9 H cb=colorbar; , Y4 L& A& J$ S, z. a cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 2 c- \. e# ?- E% T cb.TickLabels=labcell; $ S% ?7 B4 P+ t" [5 V, u. s cb.FontSize=12;; P3 p7 D' L( z end7 h" N* }( Y6 {; h2 M 9 Z5 ?. Y* G, J) N; L/ f8 p functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);$ r; s8 {: }4 x( e6 a9 b+ z0 @ eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句; O) ]+ b0 N0 d. s# [ n1=n1/181-1; %数据每181行是一个月的全球SST数据# K& }- ?) {, [1 L( R for i=0:n1/ m( y0 z1 `2 m1 o1 b/ Z8 x4 q eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);2 A2 A1 p; f2 `5 s0 Y# M; p C(C==-32768)=NaN; ! R- z0 q6 }! {* L set(im,CData,C); %更新im的CData属性 # _' }2 G z1 y1 R* Z- A set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度* J; ]! L, E3 ^* K+ r' M8 u set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 ( S0 c) L3 z( P% @; G4 I& ^3 s1 u0 p* R0 X frame=getframe(gcf);/ ]4 u. A2 ?/ \ i$ t. | writeVideo(WriteObject,frame);* O( F- Z# n+ e# N k end : P7 q2 _+ U2 B9 g eval([clear ,str1]); 5 z Q/ u* p2 {5 l# c end 5 v/ F! r9 A9 M9 {
0 u3 R" z- }- ^. \1 `3 `

效果图:

. {1 j% _1 Y6 P
5 [2 V- N& e. c6 e Z

数据来源网站:

' ]9 j; G3 I" H: a : X3 D7 j) ^2 q% x( Q& v5 s1 Q- [

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

0 J5 m. @" w, x. `1 N) c) ]8 y: z# A

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

- y. j4 C3 v: M- C$ r % K- h2 S% H* C) h

提取码8xt8。

2021.2.2更新

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

4 L- c: c5 `/ l

参考文献:

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& m) a ~( P3 h1 y) h $ ?4 I% m' u& | ! o5 W, h$ }1 l/ o ( v# u9 ?# Z7 j / y9 m8 q/ i. A0 o' A* j9 u
回复

举报 使用道具

相关帖子

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