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

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

[复制链接]
2 ^. I7 w8 R- o

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

" L/ }; F* A# J) @

matlab程序代码:

5 m3 v3 M' u8 q" e1 W7 c0 z
%对图窗属性进行初始化0 z9 C. e! q! F figure1 = figure(1); %创建图窗并获取图窗句柄! v. H) `. U* Q. j& T SIZE=get(0); %获取显示屏信息8 W( j/ l' }3 t; f set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 1 a9 O) i1 T v4 N9 k. T C=zeros(180,360); %预分配内存 & D" T$ c: s/ J& W/ k SY=zeros(22,1); %用于存储每一份数据的起始年份 ) c3 @* I. `8 `' t STR1=cell(22,1); %用于存储变量名 # d: V Y5 i a) S; d' C. K STR2=STR1; %%用于存储文件名& h' M9 T4 ?! r clim=[-1000,3500]; %设定imagesc的数值范围, x% c+ |" \3 \1 `- R2 V im=imagesc(C,clim); %创建image初始对象1 X4 _4 ?* k5 ^ colormap(jet); %指定颜色映射类型为jet # W8 Q; \9 i# l) l: o5 o txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份; G2 f% V/ ~7 {, L3 I- U% B title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);6 x$ }9 @' m/ O* j( X/ N axis off / Q) p+ q# n1 D- t7 S hold on ' R" S: c' G9 X3 @ cbar(); %显示预先设定的colorbar/ y8 |% a% y; D# G- Z) J7 E %% G! F+ [4 X. x9 l; j+ Z: b2 L2 [ filename = SST.mp4;: e' q9 W4 L4 C5 d fps=10;2 Y- q" u- m0 u" E4 [* E" v5 q. ` WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 , Q1 L/ p6 P' C) M' O/ y* x WriteObject.FrameRate=fps; : F; \# X" @$ H+ x* \; t WriteObject.Quality=100;5 G' O' [2 o: p open(WriteObject);3 b/ E! F, X+ R$ o+ u" f %% + q) o3 H( c, {- o: Y. W8 i SY(1:5,1)=[1870 1901 1931 1961 1991]; 7 q3 Z# ~6 ?6 s STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};7 s: t4 o6 g! b$ {8 j* X+ D STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; |; O1 C. f; R for m=4:19 - Z& L6 c1 G2 _ sy=2000+m; 2 J# {. S. G3 a/ w str1=[HadISST1SST20,num2str(m,%02d)];- [# D" H* H- {# I' T/ a str2=[SST20,num2str(m,%02d)];+ B f: e2 F4 O. s- `' y$ T SY(m+2,1)=sy; ; z- @* e; ?6 M) m2 w0 F# F/ G- ~1 y STR1(m+2,1)={str1};6 |* j9 P0 i7 d! h+ E STR2(m+2,1)={str2};7 X$ x- U, d' |* I9 c! Q end; h. q4 ]1 Y7 d: g+ C SY(end)=2020; % G7 j u) s; w: w3 A STR1(end)={HadISST1SST1};7 p* [. n- q" p. a+ h STR2(end)={SST2020};5 Z% o0 L1 I" v/ ?6 z : P4 M8 B1 ^1 L3 M$ ? [rowsize,~]=size(SY); @) S' m! G0 X) \ for i=1:rowsize$ p/ E3 I- r6 f' L shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt), J1 D7 w/ ]- \# Q2 l end * a1 E: X7 ?- X G2 K/ m. {9 _ 8 n+ G: }, m e7 x hold off7 ~4 U2 w2 ~* d. n# H close(WriteObject)+ K1 J& n* F8 Q6 N' \: M9 H3 U& T' { %%4 ?; o8 w% j6 }, P functioncbar()Tem=(-10:5:35);! \% T. l& e1 ? labcell=cell(1,10); %用于存储colorbar标签9 n* d2 Y i" c' M) H8 R0 U- P for i=1:10; f7 \0 G& c2 M& i: l labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; ( Y; N% L/ p6 m4 z end6 b. M/ H! {0 i cb=colorbar; 5 N: Q$ e- [# f( L5 P- u2 ` cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex! A" X# a2 i, J f! x( S cb.TickLabels=labcell; ' b% r3 Y+ q' {" N0 B cb.FontSize=12;: W5 X% S6 ^5 N7 N( ]% v end ; y3 Z' N- z1 }+ w, j5 `8 h& K5 V functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);3 H- f3 L) x0 ]3 [ eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 " t5 k' {( l7 |- a0 c n1=n1/181-1; %数据每181行是一个月的全球SST数据/ w7 y: f, M s for i=0:n1, A/ t; D# M. K( R$ Y/ r# N* w eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);% M0 u4 W! C' K: M5 d9 V2 G C(C==-32768)=NaN; [, {. Q* @- [, J4 G1 s set(im,CData,C); %更新im的CData属性% S/ S: z* o/ C. x1 I set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度, {1 }2 W5 h, c) L7 R8 E set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本# N6 ?; Z- _: j 1 D& L4 S: ?) K. Z frame=getframe(gcf); / K* J; E: U0 M writeVideo(WriteObject,frame); 9 s4 O% O' v/ @5 C. n4 R: J) E end 0 K c" y6 W. t eval([clear ,str1]);+ c; |1 m3 l: D( t# e2 m end & I: I9 v$ z H9 w9 U: f, f1 e4 {
' q" Q* L/ Y% x

效果图:

0 ]$ Y9 A& |! T
0 }8 [! W, d _0 F- x( M& [

数据来源网站:

6 Y3 ?* h; U) J% B$ \, l s2 x# D8 a# M" L* Y

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

+ M; O. z8 \2 c( C7 M

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

1 V, S0 o6 P4 y + b: k3 m( _2 y( F' }

提取码8xt8。

2021.2.2更新

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

- t, T% u, L8 q% n/ u# ]

参考文献:

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" |# [( f* y$ ]. [( v 6 l6 P a+ g" X- X! J + j, V; I0 h5 B4 o. A/ f, k, F8 r, A0 g9 `; T: o1 q 8 c) D: W: p; b( n% w5 K
回复

举报 使用道具

相关帖子

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