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

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

[复制链接]
; ^9 r$ ?/ s, X4 ]6 [

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

) b2 f8 R4 [8 p* V

matlab程序代码:

3 ?9 i) z) d8 c1 |4 W
%对图窗属性进行初始化8 Y' Q2 E8 j7 Q figure1 = figure(1); %创建图窗并获取图窗句柄1 G/ {9 `$ h9 E8 B2 I5 p2 _+ W& E: Z SIZE=get(0); %获取显示屏信息 8 z: Y6 j& G! a" N set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小4 g1 c# A1 [2 y- b% ] C=zeros(180,360); %预分配内存3 `7 C0 i$ a$ p* s1 D# K) \, F4 x SY=zeros(22,1); %用于存储每一份数据的起始年份 $ i7 }8 v* S7 T7 H! F8 B STR1=cell(22,1); %用于存储变量名 * p/ [1 j! U# P$ V& w7 j4 `7 g% Z STR2=STR1; %%用于存储文件名 4 F/ _6 t8 ~$ r, ~: o clim=[-1000,3500]; %设定imagesc的数值范围 ( Y9 X5 I% f/ |' i3 I0 _; N im=imagesc(C,clim); %创建image初始对象 q4 Q8 F& K. |1 H* S+ R; O colormap(jet); %指定颜色映射类型为jet & q$ t' B5 j6 W' i txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 & P6 j7 h# ^$ {2 M* d) H4 H* e title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); ] H# U" k* f7 ~( R$ f. ~3 V axis off5 P0 f( T% L, m, P) d) W$ N hold on % Y& n4 x4 E' H. z0 A7 r( S5 K. R cbar(); %显示预先设定的colorbar 3 M# v* }2 K( Z: r$ U) b/ h %%2 k1 G4 f7 ^2 a: X. A7 L filename = SST.mp4; 8 s6 N' q" v; D; n fps=10;7 S4 H" H- V* k& W+ M1 F% X; V7 m WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 F. G3 k9 }) `9 n _9 L8 M: ` WriteObject.FrameRate=fps;. \- A3 @$ D0 x6 e2 n y WriteObject.Quality=100; m+ A7 J' Z5 @ open(WriteObject);( y* a2 G( S& r5 F% j$ z %%. U9 m7 |" a4 n8 `1 Y SY(1:5,1)=[1870 1901 1931 1961 1991]; * Z0 Y* g8 p- D0 L, d; j6 e STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};8 `: J, `, d" O4 F STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};3 [' ^; T) z" \1 L* G for m=4:194 O( k; @6 _' X7 X2 @ u sy=2000+m;, _9 f8 G' m& D6 ~7 v9 X" ]8 r- @ str1=[HadISST1SST20,num2str(m,%02d)];$ Z" _0 S1 I8 Q. _- {; r str2=[SST20,num2str(m,%02d)]; & G; f+ U5 J. m0 X$ D4 t SY(m+2,1)=sy; * r/ O; }8 N( N" g STR1(m+2,1)={str1};9 Y5 o& E1 [) | a& | STR2(m+2,1)={str2}; : z0 Y, ]6 I' ^& a* W P) A3 ` end ) M, G4 j3 H a; U4 u! t SY(end)=2020; 0 Y: }5 Y9 ?2 \ C; P7 F o w, I STR1(end)={HadISST1SST1};: {2 Z; A* z( e4 j STR2(end)={SST2020}; * A9 k* X6 \* ]4 N: s: b: _. t; _5 C [rowsize,~]=size(SY);( Z) Q5 K3 k9 ~7 F. u' v for i=1:rowsize' Z. O) l! u6 M( w8 T shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)) x9 e7 q0 ^! x1 @ end0 Y$ J3 t4 N* N ; }5 T8 p( b c+ r( Y+ A- D hold off $ v; m- M9 {4 S- ? close(WriteObject) % V: L# y8 K8 f4 ]8 W" d %% 4 a% J4 e, g2 A functioncbar()Tem=(-10:5:35);) \0 V1 L* s9 T+ t- i6 o3 H labcell=cell(1,10); %用于存储colorbar标签8 h6 j, P$ n# E( J for i=1:10 ' ~; w; p; F5 J0 X+ e+ ~6 D' K Z8 t labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};! z2 ^) h7 @$ t- [- Y) l, r. i& @. } end 4 o# a3 M) W- [( I) I cb=colorbar;& `4 C* i B0 U8 s& f3 y& E cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex0 {6 S( D1 k( B8 y cb.TickLabels=labcell;& H/ |* M2 T0 A/ Z; O O cb.FontSize=12;( r4 \( k, C0 X% G end( D! J, h7 C3 \' m 8 X4 R& H* |, U: f functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1); $ V5 r5 P9 X7 n- ]. K. g eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句7 \% K6 O3 k, H6 x' G3 d n1=n1/181-1; %数据每181行是一个月的全球SST数据: [3 {$ B9 e8 f for i=0:n1 ! \) G; N2 i1 I3 X w eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); ! q; a* t/ ?" h9 Y8 ~ C(C==-32768)=NaN;5 e2 O' u, ?6 t7 F$ p set(im,CData,C); %更新im的CData属性 9 O# l# u/ P, q* o$ o) ^! E set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度$ K0 S7 ~$ t0 \. H set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 * e& m, T F2 K9 i& h A; a1 R: `, E- K* o frame=getframe(gcf);/ r1 ~" P( N h0 y7 u/ h writeVideo(WriteObject,frame);/ T4 i# S. m5 `3 A; x6 j3 P end( w) ^6 W- ~ Y- u eval([clear ,str1]); 0 A; z, ]* u2 a2 Z5 Q: P% Z: b; I end 4 r! m/ X' {5 ?( a2 b+ n3 B% R5 [ c
' v! i" r9 p; T5 I; g3 f

效果图:

4 [( O$ z% }9 {' l. @) o
: `$ `9 H; L# H

数据来源网站:

) Y* s4 ]0 p2 V! K! y3 p- E- C ( y" [6 b0 h1 L% s3 W

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

/ q, |3 Q+ J* u6 q5 j

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

2 T; F% ], v' [1 U. t" \ . ]/ P8 i7 J/ C0 G W* P L

提取码8xt8。

2021.2.2更新

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

- k* X% S' s# P0 W7 s

参考文献:

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 9 J/ P/ ^; Z+ I. f. I2 l y: d/ N% X0 a) K% [ " R8 t4 u( Q5 C9 Q- a4 z % X i, E' F0 U% u/ p( I J $ K6 I- j# @! ^! o# h9 E) G& Z
回复

举报 使用道具

相关帖子

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