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

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

[复制链接]
' s! r# t; B1 C7 r

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

1 [8 x' P* ^ K

matlab程序代码:

! W; Q- I# P2 V9 h# V8 z" z
%对图窗属性进行初始化 5 i1 I9 a" l- e' x: i4 c" u figure1 = figure(1); %创建图窗并获取图窗句柄" D) d( z4 k+ h( x/ a SIZE=get(0); %获取显示屏信息 y& ^& m, R1 j* |$ [- Q set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小9 d$ m* U$ F' z% i" |; d C=zeros(180,360); %预分配内存 \2 P- u' q: I* g# P* e) A# e SY=zeros(22,1); %用于存储每一份数据的起始年份 ! n6 L `2 q! j m. D STR1=cell(22,1); %用于存储变量名 7 o/ G/ X* A6 V& X STR2=STR1; %%用于存储文件名5 v! H! X: e9 k" i- i% H clim=[-1000,3500]; %设定imagesc的数值范围 * W0 Z- @/ z, n$ E/ { im=imagesc(C,clim); %创建image初始对象 8 o& _7 l7 y* P! ^% M colormap(jet); %指定颜色映射类型为jet % @2 c$ |6 b1 m& p+ n- S txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份 5 o/ U) Z; L7 ~5 }2 I- L/ ~ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);/ `$ E2 \& l+ e8 p' r9 K; r axis off 2 i- u* D$ p5 D) k% f- e hold on/ e( ?! m, D" W% I% J0 r& s cbar(); %显示预先设定的colorbar o$ [, s5 V g %% X' @$ E& W1 a/ g filename = SST.mp4; ! m: q8 Q! r# `2 n$ H5 E2 W fps=10;. {: k# x k6 e WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象" h+ Q. x. N! H4 y4 F2 V- f9 r WriteObject.FrameRate=fps;4 V9 B0 l5 Q; M1 J$ u WriteObject.Quality=100;- X+ ~4 `/ v! s* z$ J1 o; C open(WriteObject);2 L7 X+ [# c4 P( g5 c- n %% # c3 D3 N/ Z0 M: T% o: m SY(1:5,1)=[1870 1901 1931 1961 1991];* l: t. H* a% @" \$ x+ [/ A) L STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};/ N/ }$ X8 k6 ~ o& s+ H STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};" D2 U4 t- w4 v& }- ^! M for m=4:19 : b3 w2 R& W, Y) }' X* o$ j sy=2000+m; " T+ {( b( D z str1=[HadISST1SST20,num2str(m,%02d)];, a8 r' e% Z1 ^0 r str2=[SST20,num2str(m,%02d)]; # U" B) T* k8 B% u SY(m+2,1)=sy;% F; R; t1 R! V% j i& B3 n- U; Q0 a STR1(m+2,1)={str1}; $ c0 E% D' w; F9 J* R6 l$ e STR2(m+2,1)={str2}; , l. K* D; q0 ~( G# e0 V9 T( M) w6 x end 2 s/ l2 k7 l! K; e2 E D SY(end)=2020;. T8 g5 Q/ z! @ S7 O3 f/ _! f4 B STR1(end)={HadISST1SST1};& _) a/ {' I5 V6 j STR2(end)={SST2020}; 9 r3 n$ f8 B3 _5 A* y: W4 }% g ' r6 }' Z: F9 H [rowsize,~]=size(SY); / K) o* x% t- r V5 u8 i, [ for i=1:rowsize& ]/ l% t8 s$ ?. K shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) 9 P$ h( m( m& r1 P* }& E- A end" j( }- r: _3 J8 j i: A( b & r6 Q9 X) u- Z5 h! p9 R% d3 P" s hold off , u/ V3 [; D) c1 c. f. e: A close(WriteObject) % n0 K6 G& r. g: M$ @5 M8 g %% 1 y" K" G8 J7 y# b: Q( {* u functioncbar()Tem=(-10:5:35); - }% l, U5 G0 Q% U labcell=cell(1,10); %用于存储colorbar标签! W F. {1 J5 r) z( M: D for i=1:10+ Q( K% n% W$ X2 }* U labcell(i)={[${,int2str(Tem(i)),\,}^oC$]}; - P( x% ?0 n [$ p5 O end ) H3 J. s% V$ O: g5 R' U) F1 p cb=colorbar; 7 ? {; }- ]* h8 I% `+ Q8 m cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex, T4 O5 _! `1 y1 }/ N& R cb.TickLabels=labcell;5 ^% A% i) b' a0 s! I cb.FontSize=12;6 q: o7 J! C$ q& D3 u end% Z. U+ U; F4 R . N! A) t1 I& P3 O. q functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);2 f; W' L& \1 z+ P6 j eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句) g* [ e. o! h n1=n1/181-1; %数据每181行是一个月的全球SST数据 # O4 d# Q2 k/ O9 l+ T for i=0:n1 # o; K& I& i+ o8 v eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]);4 A' W" H' P/ ^% A: E4 A C(C==-32768)=NaN; 9 J& ]: Q8 o2 E9 ? set(im,CData,C); %更新im的CData属性 1 e: k' _. r7 d6 L7 y. M8 v" ~ set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度' I. _! z9 b& r set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本/ O1 h. |( R4 S3 t0 y4 Y& E5 r/ G . f: K- P6 j+ J9 } frame=getframe(gcf); 7 i+ J, _# \7 A9 N writeVideo(WriteObject,frame);+ k* f2 y, d$ | end 1 z: f1 d$ ]4 x$ k eval([clear ,str1]); 3 t4 A! q% e$ T) {/ o _; I2 D end+ t) S8 j6 B# a* Q1 k
* {9 N. l5 J, ] P5 W2 z

效果图:

4 P) B5 @: q" y G! Q# g( G7 T
7 ^5 J: X' ^$ F; Q' h4 }6 z

数据来源网站:

1 h; A6 T0 x4 v( U7 x % a8 z) Z4 T" w8 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/)

4 Q; k9 j+ I ?8 e: f% r& b

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

, Y( a: W+ R0 v1 E& ]3 k% B ' O0 v: ]9 Z8 s' T6 s

提取码8xt8。

2021.2.2更新

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

! O) O! L! F7 Y- Y

参考文献:

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 + \7 e/ q* _ h4 Z- m! t2 ?- G 6 p: R+ E+ Q* A. M+ L+ n. B( j" u( P. ^/ ~( n1 r& [* b0 K( k 3 e4 T1 R6 `, _# Z & W1 w' _3 T$ u& T3 Z2 R7 h
回复

举报 使用道具

相关帖子

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