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

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

[复制链接]
4 b2 d# R6 m: {. u7 |

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

( r/ E' P+ h, B1 P% ^5 D/ x

matlab程序代码:

+ O# ?' f6 A% S6 f
%对图窗属性进行初始化 5 d; M& k4 m! g0 V( z: D figure1 = figure(1); %创建图窗并获取图窗句柄 # w9 B* F1 ]: U" k+ J) Z: I$ R SIZE=get(0); %获取显示屏信息- {1 b! X) Q2 y( R" J3 ^ set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 I3 t' S0 R# I& C C=zeros(180,360); %预分配内存2 k6 ~" l+ [8 z, }- v7 m SY=zeros(22,1); %用于存储每一份数据的起始年份4 Q7 A. Z8 V/ ` STR1=cell(22,1); %用于存储变量名 ' M: l1 f, W* D) p! ^- B STR2=STR1; %%用于存储文件名 % Q$ ~/ Z" i9 o8 x8 b5 j6 d2 l. B3 i clim=[-1000,3500]; %设定imagesc的数值范围 : l+ p0 p) b3 r7 _# E j: S im=imagesc(C,clim); %创建image初始对象) G' K/ T5 i3 p7 E! D colormap(jet); %指定颜色映射类型为jet / D/ `* q2 n7 R; r) L txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 2 s: E; J8 f3 r4 }2 W8 @ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); * a% ` X5 Q# z2 |9 \, G) P& W axis off $ ?" t! o' ~/ R hold on* D, B% F Q. [% _. g% r9 c; L cbar(); %显示预先设定的colorbar & p, ]% g* @5 X+ G4 U %% 5 W5 r8 p& ^, I: v filename = SST.mp4; F* |& A$ k3 c' B9 K fps=10;% H o( {2 ~$ X5 \# f WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象4 j$ h% k' W$ C Q- F, P0 k4 y WriteObject.FrameRate=fps;1 k: x& } L' { WriteObject.Quality=100; . C2 ~3 J- R( t/ d ? open(WriteObject);1 {0 k, h' u* j %% # z& c6 l" F) n6 D$ g8 @# M SY(1:5,1)=[1870 1901 1931 1961 1991]; 9 r- g! o2 p/ {8 X! z" | STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; ) L7 g7 Q! v% A* |. ^& B STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};1 o- }: d! c0 p/ q+ L for m=4:19 2 q- s+ d4 s6 Q$ R% g3 y. h: c6 a: d sy=2000+m;( o( g- \3 b! h- S str1=[HadISST1SST20,num2str(m,%02d)]; 5 [( X7 o4 Z& n& I8 _: | str2=[SST20,num2str(m,%02d)];; o" Y7 i& \! {/ ~6 P7 C" r SY(m+2,1)=sy; * _2 H3 y* W( q, a STR1(m+2,1)={str1}; ' ~- A6 ~0 m+ u, H9 x STR2(m+2,1)={str2}; 4 F2 G$ @/ A Y* n end 2 J, V. [( q; v% J" P% L- p SY(end)=2020; 3 \0 n% U* ~- `, N/ g/ R0 }- f; t STR1(end)={HadISST1SST1}; 0 |! ~& g' O/ X7 `, R+ H) x STR2(end)={SST2020};7 a) ~% z: _. M0 G7 c8 T" {# r * c& c5 N! [1 O: ^( O$ Z% i [rowsize,~]=size(SY);6 L- W; E! \ y for i=1:rowsize " o" y# H6 D& F' |% d shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)9 F4 o$ y! T2 d+ R, s9 b end $ V1 h8 L* S9 r9 S# a) B9 X6 R! R- x- I0 E3 B, D hold off 4 E& g& M$ c% o( l6 [, w close(WriteObject)6 p- D) ]& x# i* [5 d+ y/ @7 g %%3 ]+ D# C0 O* R functioncbar()Tem=(-10:5:35); 2 a- o- c0 B& f# u r labcell=cell(1,10); %用于存储colorbar标签3 o# H- P5 e5 Q6 W) e9 ?; I for i=1:10 ! o) u, t0 @3 z5 U7 c! q; i( H8 ?& q labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};8 L2 o0 D' q8 u. f3 p end( R) ]9 Q- u; g; |) Q/ t cb=colorbar; 1 W9 q, q2 P9 t3 b( W/ U cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex. @% H6 m' e4 B0 Y/ _5 ^ cb.TickLabels=labcell; ' V5 b) ~2 i/ X# C, h cb.FontSize=12;' q( F6 c4 K) u/ ]8 U0 m% a1 P end 2 z& q" ^% K& \" x5 u1 V+ s4 Q6 c7 w8 K functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);% J* _- d. _' @; j& h eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句1 y. c( i/ X9 ?( b# ` n1=n1/181-1; %数据每181行是一个月的全球SST数据1 c4 a3 X) w/ X for i=0:n1 ; z" ?5 r8 R# n l5 O6 g9 E+ Y% k% P9 V eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);. n' v7 w& @# t9 U+ F C(C==-32768)=NaN;+ x( ]% _& c5 C k set(im,CData,C); %更新im的CData属性 ; P7 M3 W( D$ A! Z7 C( d5 g" |6 i8 R set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度3 [+ e8 t1 T, x" E5 ~2 w0 u L0 ~ set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 $ G/ Z7 r- ?, `, g+ {3 @6 e 8 m. y/ M- | X( F' a frame=getframe(gcf); 6 ? A* G0 [! j writeVideo(WriteObject,frame); 4 S- V1 S( c+ A( B& n# l end5 K: e3 J' F Y eval([clear ,str1]); 7 R% b5 ~# y3 N, |& v end 4 ]) N" A5 \! }' j! m# S4 Y
8 V1 h, E7 L( a# f

效果图:

9 H% [6 x$ c9 p
0 m" l A3 Z2 L

数据来源网站:

4 E' f P7 P( [. K! t . g3 k& D- R: W( Y. X7 u

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

( T7 z$ \7 R1 [8 `8 ]' S7 W

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

5 O$ o$ u3 k% d* e A# K7 ?% c( w% c+ g# g& v

提取码8xt8。

2021.2.2更新

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

( R- j& |# |* E( s& {: f

参考文献:

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/2002JD0026707 i& m& R: @. g, { ) `% y: @- ^5 M- ?9 M/ Q/ r/ a" e/ Q% c0 W: p/ K4 v / R& T/ N! ?2 I/ n- B$ |6 `) u# v ; f: \4 M9 a. Y
回复

举报 使用道具

相关帖子

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