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

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

[复制链接]
+ r6 A& M+ \, }' B

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

# o: k* O' w4 }

matlab程序代码:

7 E1 Z: L2 v( R( J, `/ h$ H
%对图窗属性进行初始化 $ o- T2 g) c7 { v" } figure1 = figure(1); %创建图窗并获取图窗句柄( ~" X6 B' \; H5 _7 S SIZE=get(0); %获取显示屏信息 ) A z# |; h& n$ X, V6 l set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 6 p7 P$ ~" q$ p4 K! z C=zeros(180,360); %预分配内存 ; Y) m8 R! P, w3 t+ [, P SY=zeros(22,1); %用于存储每一份数据的起始年份8 N3 t( Z3 M1 a$ o' R' s2 |. \ STR1=cell(22,1); %用于存储变量名 # s' {# G9 x$ X STR2=STR1; %%用于存储文件名 $ l. ?7 {9 z0 J clim=[-1000,3500]; %设定imagesc的数值范围" d( M9 m y0 z- }0 e ^4 z+ [& Z* k6 m im=imagesc(C,clim); %创建image初始对象 . U! O; p7 Z* ]0 U5 R colormap(jet); %指定颜色映射类型为jet 5 t& b/ l' _* F* G: J( ~$ ? txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份% ]8 [! l- f, |7 v3 c title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);* {3 }# M$ K% N2 g axis off7 ~4 I& ?" r/ c. d/ Z hold on! O4 T) G, h! H+ c cbar(); %显示预先设定的colorbar 3 J4 T7 G, e1 r% ], }. { %% 8 L9 `- i. ?" G; W% D( U filename = SST.mp4; % Q5 X; N. `* S* K6 t! r fps=10; * t7 T& F' G3 h8 v& ^* n* `7 n WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 2 b9 C8 ^+ P3 k WriteObject.FrameRate=fps;0 t! t% k3 C% `( E) I- x3 f- A# h WriteObject.Quality=100; 3 Y+ U5 q+ @# u9 A# P open(WriteObject); 5 S7 W/ n& D/ g9 O7 L %%2 z% d0 p( k6 A. ]3 q8 _ SY(1:5,1)=[1870 1901 1931 1961 1991];/ l: N t% V3 o8 t4 E! K STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};9 o. y, K h8 K- G) b/ f' j! L STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; x& X, @2 \4 Q4 L# F# d for m=4:19- t4 L/ Q6 @2 k$ a' u sy=2000+m;6 M0 J a4 {* e$ D) i str1=[HadISST1SST20,num2str(m,%02d)];9 ~( B, {: u2 D3 N8 c1 V% l' E* d str2=[SST20,num2str(m,%02d)];1 w9 R: y X; C9 K+ _ SY(m+2,1)=sy; . k. |2 i9 }* D4 e+ ~! M STR1(m+2,1)={str1}; : ~1 Z6 g8 o& j& O; U9 y STR2(m+2,1)={str2};3 i: ]3 S" _; d9 t' Y+ d8 a end) C; U- |% a, g, {1 | SY(end)=2020;; L' E5 D; Z0 w! R# K STR1(end)={HadISST1SST1}; , z0 u8 {/ l1 o STR2(end)={SST2020};0 u: e, L5 g* o- O! i* i& V* o1 p + T4 U) E! E2 _$ R- q: d2 O# P% w [rowsize,~]=size(SY); 4 C" N/ ^5 f& _5 u. \! M6 r: ` for i=1:rowsize% T! Q4 s: i% v0 l& v& } shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)! L6 y$ {/ {- F7 k S: j; U end * }4 o+ P, e$ b+ u4 h7 @ r- z! M" a; @ hold off : X! D8 D2 V, O ~ close(WriteObject)' R+ Y" S- l `3 q, |: }7 e %% * h6 }4 m" x# a* L( [0 v2 f& h' O functioncbar()Tem=(-10:5:35); " g! ^( O" e) [' F* d- J | labcell=cell(1,10); %用于存储colorbar标签 % e7 V1 ^; [1 l for i=1:108 Q5 ?! C& ~; ]! Y) c( C. k* S labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};. Z! C% g1 S4 h4 X' L+ ` end6 g. H; L* a( {$ o- G% s cb=colorbar;- D9 ?) ?2 J3 G cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex3 A0 Z1 i4 I3 U/ l cb.TickLabels=labcell;' A' `& _5 S9 [ cb.FontSize=12; . V& v6 K ]& D; V8 O& @0 l end , j, U5 o& X. E; y8 A6 | * A7 x" l3 M7 t functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); 3 }$ E7 v! t# s eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 9 y4 A+ h) }- y! S; _ n1=n1/181-1; %数据每181行是一个月的全球SST数据 5 p, z% y3 V% v, c& j# Q for i=0:n1 $ S* `+ h& f) ^2 X" t2 | eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); " b! s8 B6 o5 Q3 j6 L5 f J% N C(C==-32768)=NaN;% ^ l Z6 e0 k7 Z( Y set(im,CData,C); %更新im的CData属性 6 l& [ V% `% i- R- ~2 v set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 # [( c- N- O6 g: d6 I6 P( E' B, o set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本, V7 e+ h3 A1 N8 U" k% c- p- c* K/ `# g 9 L( I+ x$ w7 F; Q2 X. g% B frame=getframe(gcf); : _# Q: x1 ] _. ~& g5 c1 j: v writeVideo(WriteObject,frame); - ~# C' [& l4 r7 N3 V2 V end5 f0 ^2 r* ~' x' g1 p eval([clear ,str1]); 9 \, ]0 Z: o9 d" X end& U3 ]2 T) ?2 a M/ M
# H2 \9 g! |1 l% \3 b+ z9 L1 t

效果图:

8 ~( i. Y2 z- Y5 P
7 c9 e3 k2 e; f m! v. s7 ?

数据来源网站:

$ A# |' G* p1 [8 O - y r- o; }0 b6 t/ }- Y" Z

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

$ l U! n% {. \' X. {4 z- G4 }

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

' h9 D' \3 N6 Z5 d( o; ]* g 1 r/ D* f8 M0 `: i

提取码8xt8。

2021.2.2更新

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

+ N6 i9 p I' y* S! T) K

参考文献:

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 ! R- T$ b6 ?8 v) _/ N, H4 M" W6 R$ s; ^2 ~7 U. Y" { 5 s S+ ^* h+ g. d . w2 V1 P6 {) c9 W/ B. E0 F! U3 I! [* N% W* _
回复

举报 使用道具

相关帖子

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