|
7 v6 G1 }% l$ j/ C) t7 ~* U$ M 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 1 A+ H* b6 R/ B% j3 |/ i) a5 n
matlab程序代码:' ?- I0 f) N! j: w# V- r
%对图窗属性进行初始化! c; A+ v, i2 k6 I
figure1 = figure(1); %创建图窗并获取图窗句柄: l; U3 ^; @3 x9 Z
SIZE=get(0); %获取显示屏信息) ?6 H5 q: R+ R* ?2 D: o# c1 s
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
! q* R. m2 o6 x) y+ c4 B C=zeros(180,360); %预分配内存* x" z5 U3 O' o% @: K4 i' v
SY=zeros(22,1); %用于存储每一份数据的起始年份6 d! y: S! m) K. `
STR1=cell(22,1); %用于存储变量名
* S8 s u! W, {: v* n STR2=STR1; %%用于存储文件名3 H$ O( w/ R1 }- w8 g( G2 x
clim=[-1000,3500]; %设定imagesc的数值范围' [5 f9 \3 n! U }% b. }1 q
im=imagesc(C,clim); %创建image初始对象: k: a( B. r% {2 r8 u; {7 L, P
colormap(jet); %指定颜色映射类型为jet. |: `: W, r! U* V/ k$ R" f
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
2 ^6 V: C" e9 ~# J- T" k title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);" @; ]$ x* A/ h2 ^
axis off! H& x# g7 Y% p& D) v) e
hold on
* W6 X, C& d$ S2 J+ t0 R$ A cbar(); %显示预先设定的colorbar
7 D# h) O7 ^" a$ P %%
5 l' b+ @# c) j3 c; f filename = SST.mp4;" \1 g9 W: v3 b9 ~& Y* e/ v
fps=10;2 o r7 I4 \8 t4 y2 X% [3 l
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象& ~+ ?# S$ a) n7 O1 e0 F
WriteObject.FrameRate=fps;$ e& o6 P A# c" A& J
WriteObject.Quality=100;, H1 B7 N" \# x2 A% B( r! \% h5 q
open(WriteObject);# C8 p* T5 a: l7 L- H8 |' r
%%! P* P, O5 Y$ P# v4 ^6 q. B
SY(1:5,1)=[1870 1901 1931 1961 1991];" o/ S! Q/ r3 F' _1 X/ \- _& W7 S
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
: G t& ]- d3 H; ]; N8 t STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};& u9 S5 M" m- ~0 k% m
for m=4:194 k8 {: V$ Y" a% u% W
sy=2000+m;
: N8 N0 q/ ^& Z w' M! c3 r5 ~8 h1 e str1=[HadISST1SST20,num2str(m,%02d)];
' ]+ h9 \! N# \$ E* K. L str2=[SST20,num2str(m,%02d)];9 y) z! _1 s3 z
SY(m+2,1)=sy;
, t# T/ a# c9 n" n+ u: W3 J0 m! Q STR1(m+2,1)={str1};9 p3 k$ Y- P) ~6 q- B
STR2(m+2,1)={str2};
) B& x' W1 C# T4 V# k a# k end
1 o& w7 s' m' x* V SY(end)=2020;) r3 I6 ]7 S8 C) l8 r
STR1(end)={HadISST1SST1};# X3 P! _+ D7 |3 x
STR2(end)={SST2020};
" k* \$ c' J# z! \! E- J" v& O+ p
1 E$ ]3 t1 u- h0 Z# k/ H; ]+ x [rowsize,~]=size(SY);
1 R8 P% r6 X/ y; @$ ^4 z for i=1:rowsize
. V' k' ]; b' W/ k shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)4 b9 _( v* ~; B- l; I1 O
end9 ~ }# @" S5 L
5 N& Y* C7 [# l; s# g( V
hold off+ o8 i2 ~% m& a+ [, j( q
close(WriteObject)
$ [1 C: Y( E; W" j( \4 b %%
1 [1 p* A5 `/ h( v# l3 A) p% x functioncbar()Tem=(-10:5:35);
2 h) f* Z4 n& O$ @: ~! z$ [ labcell=cell(1,10); %用于存储colorbar标签
7 j2 x2 r/ \; z, x: X T3 h+ P) K for i=1:10/ v: A [( H7 T6 C6 H& g$ u
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
7 s$ y4 `7 M! ?" l [5 p5 [ end: d* E& ~* F( R8 A/ d4 O1 b4 a
cb=colorbar;
# S& }- C0 V+ W- J. U- l cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
0 m" ^! N0 c' M/ t6 m cb.TickLabels=labcell;; N% u. R9 s/ E9 K( s
cb.FontSize=12;
h# j% T3 J6 l! P' q end! V7 {$ u- M' ~7 a2 V! Z4 C
7 f, K+ x. Y0 G) G5 B/ S L0 x functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);9 D( s j8 H+ s8 \$ K- m1 I( H
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句2 p6 D# v( Z: E1 [: {
n1=n1/181-1; %数据每181行是一个月的全球SST数据8 B1 W0 \% s1 V! u
for i=0:n16 g! {6 o2 l: X! |& k1 C% _
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);' u' {& @* P1 S! k* E: {
C(C==-32768)=NaN;
' R _2 r' u1 S( @5 ^ set(im,CData,C); %更新im的CData属性7 A& Y( G. S. U8 d
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
/ T- x* V8 B- Q3 y4 S5 o6 R6 M7 A; m set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
) i4 k' J, N- \& T6 @% }+ n; ?. d" W# ?4 R4 F& A1 ^) I( U- K
frame=getframe(gcf);
2 \0 p( U$ Q& i+ ~+ A3 i writeVideo(WriteObject,frame);
# ~9 x8 g% t$ C" D' T; o end9 }0 J" p% i& Z) d+ @# m
eval([clear ,str1]); T2 Y3 Q8 [% p, c7 |5 K6 M
end8 B* @+ A: A; \+ y
) c( d% `/ U( c" c+ J3 z 效果图:
0 `* ^3 d2 l$ P# L( \. e
2 f6 h$ [/ |' F 数据来源网站:
! R% l3 D2 s2 L" ?2 @
4 H" t7 \3 J3 f6 T (引用声明: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/)
, g" e1 G( H! a% ^# R3 r6 f w 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: / R2 n! J3 j' `+ w2 Q5 _) k
6 \" s9 A( ?1 ?6 N. S* _ B7 [% I; M 提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
. e' N& v8 ^* Z6 U3 e: z 参考文献: 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/2002JD0026702 W& J) W: Z' ^/ g* ]1 n' _! \ d/ t
# l- ]; w7 s# w: ]5 o/ D9 G
( F5 F% b5 S S' `7 W7 Q/ C0 h' }* d- ?8 w8 v# f' ~) @
& |/ r* {$ E- A8 o4 j, U7 x. S5 _9 h |