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

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

[复制链接]
) A# J% L1 l6 w9 l! o' U

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

5 w) e8 q# \# ?* T) `1 [. u

matlab程序代码:

! W& r5 s& T( b8 ^; j
%对图窗属性进行初始化 , `# Z3 n) M8 m. C) l figure1 = figure(1); %创建图窗并获取图窗句柄$ U: n6 w$ Y4 T4 I SIZE=get(0); %获取显示屏信息6 Z" T4 ^% [5 `% Z- b5 F4 H- s set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 - k/ z: d E7 R) T. n C=zeros(180,360); %预分配内存1 Z4 b( o3 S" j% H SY=zeros(22,1); %用于存储每一份数据的起始年份7 R6 O0 h3 H6 y2 M- {2 _ STR1=cell(22,1); %用于存储变量名1 w& U5 C8 W( \4 s STR2=STR1; %%用于存储文件名& k [& H5 d% L: Z% ^ clim=[-1000,3500]; %设定imagesc的数值范围 ! Y* W5 V* j/ G ~3 o$ { im=imagesc(C,clim); %创建image初始对象 ! r9 i% ]6 ^' y/ S; n colormap(jet); %指定颜色映射类型为jet5 M9 l- ]& |) c% X- o txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 % a. f9 I% j$ b4 l title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);( x+ l/ f1 q) d, T% c axis off j, m: G5 m. t" v: c* P: I hold on 0 a; Z/ B* N- U% y' v cbar(); %显示预先设定的colorbar ( d+ p, A0 {. z8 S% M+ F8 z' p %% 7 o8 i! x: N. s. W filename = SST.mp4;( A/ b$ E0 _$ M& E/ R fps=10; 5 Z5 P5 x, |3 y# j3 i. r" j& p WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象: J$ j8 u8 i ~: H WriteObject.FrameRate=fps; # h& ~; _7 J9 m, E, R WriteObject.Quality=100;6 O4 {6 ^6 D# ~, p open(WriteObject);: F' J" F8 i+ d+ x %%4 ?9 E# I5 T7 M+ R* a SY(1:5,1)=[1870 1901 1931 1961 1991];' J f8 K+ Y1 ]2 [ STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; , G7 I% U3 s% s, W, v# O STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};6 _9 x% S4 B" ~ z( c6 ~8 _ for m=4:195 A# y! T/ p' \( [4 w5 g sy=2000+m; 0 ^2 K- a1 h6 ]: U str1=[HadISST1SST20,num2str(m,%02d)]; 5 k0 C/ h9 Y( R* i str2=[SST20,num2str(m,%02d)];. E. ?- r2 C7 O3 z3 q m3 f) g: P SY(m+2,1)=sy;7 J/ p1 C1 O6 Z: f STR1(m+2,1)={str1}; 7 B. z/ i3 d% W% q STR2(m+2,1)={str2};3 w6 Z* \- |/ N7 W end; M2 T; c$ V( c/ |& A SY(end)=2020;$ u1 n2 N. Z9 a9 U STR1(end)={HadISST1SST1};4 `. u* |3 F1 g8 d STR2(end)={SST2020}; `2 I4 g6 M5 W2 C6 Q* T ! N% y3 p' l# S3 l# ~* J& h [rowsize,~]=size(SY);: ]2 g t6 I4 v for i=1:rowsize " Z: W% H" d, D8 ?5 ?9 u! I shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) / d" F1 Y1 f+ M5 e* V1 d# P end ; i8 ^# p0 g: \0 h: w ) {; C4 p: C% ^/ B- ` hold off+ A' P/ D1 \$ J# E close(WriteObject)$ {( `* R! N6 P# b! e& w- i' N# J %%* n$ `# G; j1 @' R functioncbar()Tem=(-10:5:35); 5 w6 F h; F5 Z- l/ m$ A labcell=cell(1,10); %用于存储colorbar标签 ! ~. \+ Q3 C' j- K& E for i=1:108 H" v( Z0 Z5 `3 @7 z- T labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; 7 y1 F7 t1 l \- b Q end 6 j% c3 q( [% _ cb=colorbar; * J3 Y+ h6 B& X- w6 ? cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex # I ~3 c8 c. k2 t6 G2 V cb.TickLabels=labcell; ! r6 `: `; e7 t4 ?* M; c9 \ cb.FontSize=12;2 E0 M2 Q V/ _" g& A) d/ v end 6 B; h& M0 e4 i$ k' l , y0 n/ @- e2 S3 R* s functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); 0 P5 L7 g" m1 y eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 % R- i3 R: S& h n1=n1/181-1; %数据每181行是一个月的全球SST数据; m2 V0 G) p& ~' x3 Z3 I1 R for i=0:n1 ) r' h3 ? M6 d& N! [; a4 } eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);: a3 a+ w* r1 |( f C(C==-32768)=NaN;2 N, a+ p2 _) w8 v. o. O/ a set(im,CData,C); %更新im的CData属性 / C' Q' a4 L' n+ _7 G. n set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 3 X* j6 M% {( {; |8 R1 N3 ?- ^9 G set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 7 u/ W* w" P3 S. @6 J" U 3 ~( N, t! r* ?+ F( X frame=getframe(gcf);# Q* y! z( P% d& v3 R2 K writeVideo(WriteObject,frame); 3 E; X- f* t4 ]* k2 S" f, z5 L# ? end 7 M4 [6 f9 s" F L4 l8 W0 ^0 y eval([clear ,str1]);/ c. W3 H8 r a0 z end : E- g3 p+ I! b" d+ [* P% [
$ G0 V P# f! o5 B0 |1 F

效果图:

. N u1 s& ?# G
: t- ^! R( H+ I4 z

数据来源网站:

% y& P6 J+ U: Z: e Z2 z$ g# p$ o# S2 I' t

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

$ V/ V, |# O0 c; s' k- D) [

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

E/ X/ G2 C) `( B! _3 e * s9 c, K' O/ w( t4 ], V

提取码8xt8。

2021.2.2更新

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

; ]" j4 |+ w1 y, d: U5 V1 Y9 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 & L7 i/ B6 T4 C2 p6 h * P& Y9 k. j) u8 [# o T9 f+ J$ Z s. ]) i) f+ Q# G ) u8 z# j2 K Q) ^ 4 H* ?! p" L6 I/ Y2 v9 U* S9 x# |
回复

举报 使用道具

相关帖子

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