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

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

[复制链接]
3 C K8 }) n C! {9 ?8 n; K5 v

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

# h# k8 m0 ~0 E' E4 S: W( D

matlab程序代码:

) w' k; f d. \7 Y% g
%对图窗属性进行初始化- d4 ?5 _! S: e9 b1 q9 r+ o figure1 = figure(1); %创建图窗并获取图窗句柄 0 X( `, h+ K' c4 U4 N& a2 X SIZE=get(0); %获取显示屏信息7 _0 q w3 _$ l( l set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小) F: Q, E! {" E ~, ~1 W C=zeros(180,360); %预分配内存( t& x/ o' `& b/ q4 C( i SY=zeros(22,1); %用于存储每一份数据的起始年份- s9 q6 x# u1 k% u! ?. M STR1=cell(22,1); %用于存储变量名 + i6 s0 Y- o% J, O3 Q9 P. K f STR2=STR1; %%用于存储文件名8 i" V) P( }8 d+ C: I clim=[-1000,3500]; %设定imagesc的数值范围 5 _# E" @8 \2 A4 U2 L$ M im=imagesc(C,clim); %创建image初始对象5 ~+ u( R4 I. g% g colormap(jet); %指定颜色映射类型为jet0 t: Y% ]. A$ h6 ~" l- [0 g txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份4 B9 A* I2 r9 T: J- @5 m, x, I title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);4 x8 Q* M9 F9 ]( t* g axis off ) j( U: u% l1 Q4 x( j hold on 9 @8 o- Z3 [3 R cbar(); %显示预先设定的colorbar * j1 C) Z4 v0 m! t2 C2 { %%2 P( e6 y7 a) q4 O filename = SST.mp4;" e6 d. ^% L7 Z( [" L" r" x" \" [ fps=10;. k/ e; x8 ~0 p: q# o% t; x WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 9 b2 G- o; }. Z9 S8 N WriteObject.FrameRate=fps;3 K0 j9 m4 f2 ] WriteObject.Quality=100;1 D5 f, Y, V8 H2 z# C open(WriteObject); . F% F5 l9 W; j %% / P% E2 _' w3 | SY(1:5,1)=[1870 1901 1931 1961 1991];2 V& o6 {* o7 \0 H STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; ( y1 s4 `, Y* i0 \0 g STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};/ `/ o+ O& \$ a( O- f1 ~ for m=4:19 ) q7 n. I% R7 i! S" G" `. X d# G sy=2000+m; 3 k3 L# n4 {( e s str1=[HadISST1SST20,num2str(m,%02d)]; " _! y; h0 V; J$ V+ k5 A5 y' G i str2=[SST20,num2str(m,%02d)]; 2 d# U% S. @# I* i2 z SY(m+2,1)=sy;6 J$ d4 l8 U' ] STR1(m+2,1)={str1}; c, ~% V: U# x p2 K% k) [" P STR2(m+2,1)={str2};- j$ P, k/ W% |0 { L4 Q+ E end+ Y' Q) x/ H7 n0 N SY(end)=2020;' j" x! E: {4 V4 Z! ]2 Y" w STR1(end)={HadISST1SST1}; 5 x- V' L6 R' }( B8 q0 {7 R# Z STR2(end)={SST2020}; 7 A1 ?$ f8 ^) z4 x6 u) Z + }9 {2 a! I. w+ }6 X$ D9 | [rowsize,~]=size(SY);+ B( z, B0 E6 ~6 B4 [$ x for i=1:rowsize2 v7 I) N L% Y. p9 Y" f8 a shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)4 ^9 u7 m& q/ h1 o+ P3 J3 `% n% N end6 T0 f0 F2 @: y0 x \) s |6 n " q: z; h* [! s. _6 k hold off( r: C) {# m, D close(WriteObject)# G* _+ G8 ]% P %% 7 n7 T7 _) v; K! T; f- T functioncbar()Tem=(-10:5:35);- ^- F$ Q7 n8 [ labcell=cell(1,10); %用于存储colorbar标签 * y7 J! ~ ~- w3 s& w* ]6 l7 o for i=1:10 `% Z% B# x+ ]( p labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};& `7 z) E. {- \0 Y _ end 6 ]( w6 V ^( s' }7 _ cb=colorbar;) d6 e) u" O) v cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex8 {; w4 V* S' d1 }' ^7 L cb.TickLabels=labcell;/ \1 s P% y W2 P7 I" T M cb.FontSize=12; x. |' k. k, D1 E end2 J. j4 B4 |& J9 w# Y% S4 U6 v - S( R9 f/ A6 r% i/ K9 p6 ?& Q functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);8 t# b6 ?% b7 v- D eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句$ ?4 F1 R' I/ c! S0 m- X# @ n1=n1/181-1; %数据每181行是一个月的全球SST数据9 X% R+ }2 `/ O& w for i=0:n1( a! O! Y8 s( V5 G eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); , w& t) q8 M4 m% Q& P. q/ s/ W; y3 N C(C==-32768)=NaN; $ g, a& Q' H* Y& s$ K6 n8 {9 n set(im,CData,C); %更新im的CData属性 . e' b+ s2 W* {& _ set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度 ) C( t H6 P- l6 h5 | set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本! H8 A! ]! x9 A# F: g5 g; Y 1 u$ g; W1 n0 a frame=getframe(gcf);, S% R( P6 [4 A/ W. F! B# a) ^. e writeVideo(WriteObject,frame); 6 D4 a J& Q. B5 w$ K' C end6 o4 G" l7 O. W3 N o w* _( j eval([clear ,str1]);8 L8 g* `9 c3 ~ end + J, D9 a5 v1 Z/ E2 R4 X3 Q: N
; _5 d' O6 t4 w. N. S: q7 @

效果图:

8 o, _! {# C- ]; }( F8 Y
. h/ Z+ G" _# @* z

数据来源网站:

0 N. `+ Q, S$ U3 x$ y3 ] . i: z: r( h! u$ ~& z+ h5 `# b" N

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

2 C" q. ~- q( D, g

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

& o$ \+ O h3 B& ]& a0 {8 H5 ` 5 \, B+ {/ @6 |. x- p2 Z

提取码8xt8。

2021.2.2更新

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

1 P' j) w! k2 t& s$ r, O, ]# 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/2002JD0026708 M& T) z9 ]& J& ? / K2 v4 \! W4 z, U 0 S. z2 z7 ? Q: e. N' W8 J& X% ]% \6 e% B0 b 0 W, z6 ?7 M; Y% l
回复

举报 使用道具

相关帖子

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