|
/ H3 i M3 l( p9 y8 |4 _# Y5 Q/ h 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 ( s) a5 Y6 R8 ]- l
matlab程序代码:- \4 h8 W$ f3 O7 U+ A6 A C
%对图窗属性进行初始化1 L j3 w5 G; x5 m8 y7 y5 j
figure1 = figure(1); %创建图窗并获取图窗句柄
. [9 T# C6 t1 Y3 P% B5 F; p SIZE=get(0); %获取显示屏信息 F E4 S) a9 f* p7 p0 b
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
* e0 B a. }3 v3 |9 k C=zeros(180,360); %预分配内存
0 U( s+ `( `$ t3 |7 o5 t& C" | SY=zeros(22,1); %用于存储每一份数据的起始年份% [- F0 u; j- D
STR1=cell(22,1); %用于存储变量名
/ C6 T2 J# V4 L( X2 m; G STR2=STR1; %%用于存储文件名
/ G* E2 `, y+ Y; B clim=[-1000,3500]; %设定imagesc的数值范围
. d; w' R1 T& }7 {7 { im=imagesc(C,clim); %创建image初始对象$ K( V: U, A9 n- a/ k, y0 N
colormap(jet); %指定颜色映射类型为jet
+ Q) O* q f+ j) Z# z txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
, ~+ ~- q# l: r! h/ s( h) C7 [ t title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);, y" C$ R4 p# B
axis off
. |% y# F0 A. p& j# U0 R0 M6 P hold on
( z/ V+ U' C0 w D+ w2 W cbar(); %显示预先设定的colorbar
. U* @) T4 Q" h, M5 M %%0 F3 C! P/ u/ A0 T
filename = SST.mp4;
/ u% M* |# f$ S2 N9 g A. |1 D" B fps=10;! [$ M. r- T9 ^; ?" N5 c( L7 b
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象
$ h) m; R I( Q! C" A5 u, N4 z# E WriteObject.FrameRate=fps;8 I# y# K, M+ w, L% M1 x- F
WriteObject.Quality=100; Z$ M, x9 H+ H) c1 l6 t5 J
open(WriteObject);4 p. ]+ X* J, s( o
%%
I5 B% }& O. A4 e SY(1:5,1)=[1870 1901 1931 1961 1991];
, J( Y- k' t0 K G$ t2 o5 r8 s6 a STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};- p) n( C( V. m9 `$ U
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};& f+ a) C4 Z; a$ Z0 f i7 D
for m=4:19
/ s& q! g, n5 [' J. G: E sy=2000+m;
3 n4 b" s H+ i3 o str1=[HadISST1SST20,num2str(m,%02d)];
9 |( c4 V" a# x8 n str2=[SST20,num2str(m,%02d)];
8 U2 y; `+ W2 m1 u- E SY(m+2,1)=sy;: H8 M2 a% j H+ s% D3 C/ ~; m1 {) N+ i
STR1(m+2,1)={str1};$ t1 O* }' u& F, u
STR2(m+2,1)={str2};
2 f" Z) ~; Z9 ?. F# B0 h) s2 P( ^ end: }9 }! B9 v5 l* s. n
SY(end)=2020;
9 T, p9 A! c$ i, r U) Z- o2 O# c STR1(end)={HadISST1SST1};
a* [8 x; D3 w STR2(end)={SST2020};
8 t) ^( N; h# |8 ?. B1 W0 k1 Q' Z& ]
[rowsize,~]=size(SY);
1 x4 p5 R9 d9 d K7 m4 x for i=1:rowsize" U9 l. b7 h; p- p- X5 j& O
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
" p0 J( f, ] T8 J, g' Q1 L end
: k1 T+ p( @% O; f
* F. ^% u7 `6 ~3 G5 b hold off
, J: h* |) B4 i8 z4 F8 h close(WriteObject)7 v" C8 S- x G' L) U
%%* c' P$ M6 u1 U+ K9 P" J
functioncbar()Tem=(-10:5:35);
, L* D9 O4 E" `; l labcell=cell(1,10); %用于存储colorbar标签
) j3 Z2 a, n! d& L2 g+ A Q1 P9 { for i=1:10. |. G/ x! F# \' ~& v7 y
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};5 u1 e& r7 P" n6 K8 m/ s
end( j0 z% n* V. K; ~. P
cb=colorbar;
5 O/ i# ~/ N; y' _$ J! g( e- P& q. ^ cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex8 W( ]+ s' i) l9 |, B
cb.TickLabels=labcell;
/ }! L3 e5 h* J9 \! E" `, i cb.FontSize=12;. `5 W) w( D0 ^: E
end K( ~% p: E7 p+ T3 G- ~) b
9 R. ?0 e) c8 | v/ u* D functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
; t- Z3 {. e$ v: ~ eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句# W+ S1 T m5 ^/ A ~- l
n1=n1/181-1; %数据每181行是一个月的全球SST数据! ]* H: G9 g0 R/ ~ I3 l
for i=0:n1
# }+ I8 u0 L# L7 D eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);4 Z+ A: g; X- l
C(C==-32768)=NaN;- w p! U* j( G0 O* A
set(im,CData,C); %更新im的CData属性! m" ]8 e7 S2 [ R
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度0 E" I- F0 b' j: \
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
! A, x& E! ~4 G! a8 D- E3 E$ u
3 G( ^( V; G0 E frame=getframe(gcf);! ?; E; k; N7 _# B3 W5 M$ x
writeVideo(WriteObject,frame);; R7 l% C+ S/ E* y( Z9 R, N
end
5 N, m4 b5 K7 I+ a eval([clear ,str1]);% _9 _, V. ^( |$ K! M
end) u9 F1 E& {! s1 f% G
. Q) l1 Y c: }9 X( r 效果图:
: ~! F+ [$ M. d0 ~/ {" H6 D
* U& A8 Z! c+ Q& q& R 数据来源网站: # o4 a# z6 m/ w5 o
0 O0 g, A2 B5 x0 v7 k4 ^1 I3 p5 k
(引用声明: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/) / k/ K/ K6 x! x6 C& k3 u8 ?" m; A% p
代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
# k9 I" |! u3 g# t: [ 8 X" C* G, m1 {0 d9 n. {& k ]" s
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) & m- L9 A& B% x
参考文献: 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/2002JD0026701 Y5 m5 ^! _) l4 m+ P2 x
3 d; a9 @* }) l7 {2 s I5 m% R4 l4 ]" w* q8 b4 l7 e
; h8 V7 d, b, z7 l+ M
9 v8 v( _5 r$ b! ~9 J( _ |