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

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

[复制链接]
' J# J: H4 i* t! n- m

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

3 Z: A9 Q1 y- _' N/ a) A( Q

matlab程序代码:

& {4 L f" w$ f, o
%对图窗属性进行初始化 , j8 J2 {( G2 Q; ^ figure1 = figure(1); %创建图窗并获取图窗句柄 g8 Q* }% @1 Y3 y* u" n" q8 b SIZE=get(0); %获取显示屏信息- O' J1 Q% n& a7 g8 ^8 K set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小) \8 X4 g- S, v& m C=zeros(180,360); %预分配内存* T+ [/ T: w! G/ }6 M( x/ L$ D SY=zeros(22,1); %用于存储每一份数据的起始年份 ( f' X/ W2 }* E/ B9 w# Y+ B* | STR1=cell(22,1); %用于存储变量名+ W, O: |8 R* f( P7 d, H% Q STR2=STR1; %%用于存储文件名' v: x! t- I5 a clim=[-1000,3500]; %设定imagesc的数值范围8 m; R* i9 ?) j6 U* _ im=imagesc(C,clim); %创建image初始对象 ( N* \# o) N; y8 V5 \/ U& Y6 m colormap(jet); %指定颜色映射类型为jet5 e I# M# P a: G. v6 e7 e" c) F txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份) R9 |- s% Q: X/ s6 J: g8 G title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);5 d4 S8 i3 K0 B0 u axis off( P( h0 G) n" {1 x# t, |1 m2 w4 m hold on ) t; Y+ l4 d; N D+ E cbar(); %显示预先设定的colorbar# b. P. w7 q7 _2 f3 f7 U$ p; e %% 2 c+ _4 [* B+ u# C) }6 s) E) H filename = SST.mp4;1 [! b% c3 c" Y5 d! \ fps=10;% g7 `" g& m: V0 G. H. H1 T WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 & `$ _/ B% O1 |# ^% C WriteObject.FrameRate=fps; ) V* t& X! {4 D) L1 ] WriteObject.Quality=100;, y' |2 F, k, Y6 w' m open(WriteObject);! ]2 C) B4 w% S2 Y$ P; ^ %%5 l0 a9 D6 t( p3 D+ o/ k8 n8 x SY(1:5,1)=[1870 1901 1931 1961 1991]; 6 U2 K7 L# l, e( `2 o. w STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};5 y- C0 i; W! q( R STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 6 d4 O: r$ T0 p+ F$ v for m=4:19& A. r3 e$ Q8 e! {/ @3 o9 {/ o sy=2000+m;+ U. H1 E. \; [; b str1=[HadISST1SST20,num2str(m,%02d)]; 4 H, b) k) t! h- L. D) F' y str2=[SST20,num2str(m,%02d)]; : O( z: Z3 T/ U3 B SY(m+2,1)=sy;5 J/ Y7 A1 r% E& ^ STR1(m+2,1)={str1};* H. _" L0 e9 M$ h* r STR2(m+2,1)={str2};- D7 [' T4 a4 n+ Y) z# u: r3 q end , Z2 q2 ]* v* x9 N SY(end)=2020; # I, u4 S0 M% U! q) w6 D& z STR1(end)={HadISST1SST1}; _7 W" w7 h1 V STR2(end)={SST2020};& B3 M) C0 ]; u; }4 y4 g0 F* h. y $ a" @9 Z2 h3 u9 O1 f5 }) W [rowsize,~]=size(SY); 8 D, J) A0 P, W+ t% r0 [0 f) R, J for i=1:rowsize+ J+ T% |; p( ?( L. i shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)' S( R, ?' j7 I, N end ! ~" O D( d2 G p/ P q # w- Y5 C6 v2 `1 k5 d) p hold off5 C% d& d2 y7 }/ t close(WriteObject) : J3 g2 `5 Z/ h6 h %% $ Z; H; i( h6 X" O$ t functioncbar()Tem=(-10:5:35); & P6 W% |' G$ F6 a labcell=cell(1,10); %用于存储colorbar标签 8 \2 W6 c1 s3 Y0 L for i=1:10 0 e( X6 y* `/ Q labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};+ f. B- b: f. _/ R& u" C8 [2 M end* S( h5 d- j8 K# R: H# B# R cb=colorbar;7 x+ p% O, ` b cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex 0 {: }4 X- K6 t0 Y/ R O# b q cb.TickLabels=labcell;1 h( s) b4 ?9 v: x* Y: H cb.FontSize=12; 7 M5 y/ S/ F5 y. r; r end9 j# {- b/ a2 ^/ _+ \* O% @) f & Y) }" R) ]3 T; @. n1 u& T functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); * O( o0 b( N9 ?% m eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 7 l$ w$ N* k$ f1 g j; P n1=n1/181-1; %数据每181行是一个月的全球SST数据 6 o( e7 b5 u @% b! K for i=0:n1, C( h, ?! k% G* @% X" A! M eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); 1 H" S' s2 \ _3 ~- ~ E C(C==-32768)=NaN; 8 p6 ~3 b6 N) @! M set(im,CData,C); %更新im的CData属性& F3 l+ G, r8 h* N! x9 `7 f set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度! o7 i9 w6 I# X$ P( {; [ m. |+ b set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 + y' C6 t2 J8 m4 R7 a" n2 U; o 4 [6 m/ f8 P+ z! C# i frame=getframe(gcf); * I6 `; c* |9 E! G1 F writeVideo(WriteObject,frame); : i0 |3 r2 d* f3 O; U end ; z5 s2 ^# |! F* M' _8 H eval([clear ,str1]); $ }1 c) }6 m0 z; r7 g7 h end - u& P! J2 E% P9 ^) q' r6 a, x8 f
( r" I- c5 b) S. C9 q

效果图:

, O9 i8 O1 W1 R- [4 |( _" i7 _' b- s
; R- b# S. P9 S% c8 R- \, ?) K

数据来源网站:

) I: k) F1 Q* V& P# V- ~; i 3 I2 b) Z# c2 J. v8 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/)

1 i6 B5 [& J$ ]) k" }. J" k

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

; |3 |- f& A) z6 S $ S# h8 Y4 j0 Y8 F3 I

提取码8xt8。

2021.2.2更新

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

. ]7 ^: k# o$ i, @# K) ~& O. q

参考文献:

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 + ^& L# _4 y" D& d + Z4 C6 Y) L4 l/ s0 B2 c' n' Y; e" u/ H3 h0 P1 d( F" `1 r$ O `9 N2 \) q! J; e ; G7 a+ G% H' P+ ~( g% ~
回复

举报 使用道具

相关帖子

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