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

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

[复制链接]
8 [- b' w: T" V

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

' J2 y h( O7 l$ v3 {

matlab程序代码:

4 l( Q4 X, [7 l2 }
%对图窗属性进行初始化 2 _# V) A. s! D; X3 U- X* m: s figure1 = figure(1); %创建图窗并获取图窗句柄 ' }# u5 `& g/ U7 J SIZE=get(0); %获取显示屏信息/ B0 G6 I* h6 c set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 7 T9 d' l+ x- z1 q- x7 G* Z+ m C=zeros(180,360); %预分配内存6 E9 p. e+ p, F+ R SY=zeros(22,1); %用于存储每一份数据的起始年份 Q$ s) \& }0 \4 ?& W STR1=cell(22,1); %用于存储变量名) E6 \- C; |% @/ l STR2=STR1; %%用于存储文件名 & k: }6 r2 p/ s9 c clim=[-1000,3500]; %设定imagesc的数值范围 + {/ S4 a% w! q8 g8 l* P3 M; s im=imagesc(C,clim); %创建image初始对象 ( T/ y& `8 ^9 y2 p colormap(jet); %指定颜色映射类型为jet$ ^ v1 B! Z: Y( d9 \2 r+ w txt=text(320,175,0,,"FontSize",20); %初始化一个text对象,用于显示年份和月份( [# L/ ` q8 s* e6 b, w& Y# g title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20); 5 ]7 I1 r/ j1 k# m* k% r axis off 4 W9 @" n. y% Z3 g. f& l' O hold on$ V: u6 s# z$ k/ J. W( j1 G! F cbar(); %显示预先设定的colorbar 4 ~$ Y0 u" @1 o5 I& b" z %%# G+ p' ^3 W+ H: q0 b filename = SST.mp4;, G4 p0 j3 X% v4 }- E- Y fps=10;. }* i; b$ Q7 l/ k' i7 O0 _( O WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 : j7 D2 c" v0 Y {( A5 A WriteObject.FrameRate=fps; / e6 W5 K8 }: t+ k WriteObject.Quality=100; 5 [0 b7 K& V( }1 u7 B open(WriteObject); - l) u* `7 f6 R% r0 s% B/ a %%# n/ e. G* U" Q$ _3 i SY(1:5,1)=[1870 1901 1931 1961 1991]; 5 x" z7 m% V; z4 u2 c( O STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; % |3 W" |! X& J STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003}; 7 ]7 z9 }: t8 B: [5 \7 V$ l7 E- J for m=4:190 c# a3 H* C( }/ w% L! Y2 Z8 j7 j sy=2000+m;) ^7 ~/ N& u7 c* ^; {3 S6 ] str1=[HadISST1SST20,num2str(m,%02d)]; 8 E, t- z) h! V( k' F str2=[SST20,num2str(m,%02d)];( {7 |, u/ t! a SY(m+2,1)=sy; ' i4 W8 \% U8 U- N3 A STR1(m+2,1)={str1}; 8 s9 l4 J* t7 r# J3 R/ X STR2(m+2,1)={str2}; , b+ W9 j6 x. G7 | end. z7 i9 @0 P% F) Y& Y SY(end)=2020; 1 |5 d3 U' O) \9 W F) s1 d1 ] STR1(end)={HadISST1SST1};* D% D2 }' ]2 H, K* G STR2(end)={SST2020}; 9 j Y7 c4 r* r' Q% p& ?+ f1 R. S& Z, ], B6 P# @ [rowsize,~]=size(SY);& l' j/ g6 X6 p! ^* H2 ]. K for i=1:rowsize 4 T4 r/ n7 Y" t, x/ i" k# J* ~! U. M' ? shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt) + S# j& M4 W2 r end 7 \% [0 f: w: {3 j" H# ]3 w& e; w5 }. O6 k hold off8 @; Q+ Y E# {: K1 j- n1 o close(WriteObject)1 U P. u/ U" ]9 d %%0 o) d% R- [ q functioncbar()Tem=(-10:5:35); 0 I( |& U4 ^- N- s! g9 [ labcell=cell(1,10); %用于存储colorbar标签0 \4 o8 ^; }) U for i=1:10 ; h7 n+ m- Q5 p# A+ k3 I, X8 L# I* ? labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};! d3 G8 ^9 j& [8 u6 w end ) E7 P/ V1 Q8 h, m7 C/ H# b cb=colorbar; 3 v7 Q7 w; @* g: A1 K* S, f cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex$ y, @" D; }" O- c( ~ v* I cb.TickLabels=labcell;) G! Y) @. y' X% q% t cb.FontSize=12;4 S4 p7 h2 M$ x2 V" \ end. D; t" f$ G$ T6 x + G. r! m: C- @6 c functionshsst(str1,str2,C,sy,WriteObject,im,txt)load([str2,.mat],str1);1 h P0 i6 m4 E% {. n eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句 2 r( R5 y1 S ^& G. m n1=n1/181-1; %数据每181行是一个月的全球SST数据+ `- d0 o8 F: V7 ^- p0 H4 d for i=0:n1 9 E8 Y4 S$ ?5 g4 `* }: \ eval([C(:,=,str1,(2+181*i:181+181*i,1:360);]); " P( @3 p# `3 S# a8 R C(C==-32768)=NaN;- {, l# y; k1 c' y D2 C set(im,CData,C); %更新im的CData属性! b- d( H$ x( ^4 u: j. C set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度/ |% }& u/ L+ c8 E set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本 3 X a6 X9 b, ]8 z $ t1 d$ v/ A$ I frame=getframe(gcf); ; j3 C/ j* ]+ L; X& s writeVideo(WriteObject,frame);) i; u! _1 f X* B- G% r3 y/ |$ x" _ end. ^& r- R b9 N0 c eval([clear ,str1]);- ^! C9 { l, e4 X/ V& a end! Q9 z7 S; D1 d6 |
: q% C0 u- ^/ T/ E

效果图:

* }1 Q5 P. V. n7 g! J% L6 ?; r
7 y" A5 B& C8 ~, O

数据来源网站:

1 Q2 V1 \0 n# a9 K+ e6 U( f & L0 u o: D! ?9 t! P

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

9 H5 A1 J) h8 V3 p

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

+ e, _( N& c5 F; g) Z# E " n* `0 V6 y3 b2 B/ G) p5 n

提取码8xt8。

2021.2.2更新

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

" g2 E$ ]5 o# p3 ]$ v0 a

参考文献:

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/ J6 x4 e! n) o7 ~" E1 f ( g# n' _% r( ?, J1 @! }: o9 d, V* [9 C5 G 8 X6 K% r8 o" v, q" E- r" A# ]; G6 I2 B2 ?3 Z
回复

举报 使用道具

相关帖子

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