|
! L7 K) O, k m8 e 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
; g6 ^; @6 c% [& K( g& N matlab程序代码:: }# N% _, H; Q9 X e6 r8 ^
%对图窗属性进行初始化
/ {, O. m: _+ L* [: r4 r% P, g* U figure1 = figure(1); %创建图窗并获取图窗句柄
/ b% a* D3 U$ ` q* \7 f SIZE=get(0); %获取显示屏信息
% n$ `' j3 z" r" R: M5 e( d set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
7 J1 Y, |6 s- `# y8 ~, ?! N& R C=zeros(180,360); %预分配内存
2 R' b' A. H ^1 I7 A5 E4 m$ E8 z SY=zeros(22,1); %用于存储每一份数据的起始年份" |4 J" W% m; a w
STR1=cell(22,1); %用于存储变量名
' v1 h3 c8 B% t+ d STR2=STR1; %%用于存储文件名8 K4 b; ~) O5 x8 f q
clim=[-1000,3500]; %设定imagesc的数值范围' }0 ~, E- Q5 b3 Z. M; ^3 }% S
im=imagesc(C,clim); %创建image初始对象
( a/ i7 u* j6 e: G( D$ q2 R colormap(jet); %指定颜色映射类型为jet7 ^2 q- `& y) k' b
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
* B& c v8 V) l3 l$ h* m& H7 G title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
6 l' G9 o3 a1 r! I axis off
/ X1 C& }! i0 K% E) z+ N hold on5 d! }# \, r, r( Q
cbar(); %显示预先设定的colorbar6 s. c6 A4 F/ L$ m( x9 f; b
%%& P# I: b' q2 i: T) J' f
filename = SST.mp4;1 k, ~4 _, }% j
fps=10;* t; n1 d, K6 u8 V& y- O9 q6 e
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象
0 s* E/ `8 w2 R7 c/ R# | WriteObject.FrameRate=fps;# ?. X5 W+ Z* ~& q( M
WriteObject.Quality=100;
2 @5 n: j7 n, b. A) d open(WriteObject);/ f8 p. M5 C' {# P! s
%%& [* F+ [* V$ a0 V# l6 k: z+ H
SY(1:5,1)=[1870 1901 1931 1961 1991];7 T% e9 z! ?1 b- v5 K; ]+ R
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
( l# T1 p* I) b$ N6 ?# ^/ J: T STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};2 D/ Y. W, z* B2 X, Y3 I
for m=4:19, @( ~; ~) z6 z. _1 `0 C: b
sy=2000+m;' Z$ f+ s, ^. }* z2 L2 s4 f. ]4 [) q
str1=[HadISST1SST20,num2str(m,%02d)];
' F: K! ]5 T/ h7 h4 r str2=[SST20,num2str(m,%02d)];) D0 U" a9 W1 ^( T2 o+ X. D
SY(m+2,1)=sy;
& _2 M: _: i- f3 X& T3 z$ x STR1(m+2,1)={str1};' ?, w+ B- b( e2 z, M9 A
STR2(m+2,1)={str2};) u$ s4 J- ], r3 i1 Y6 d, [# f
end
7 {# B Q6 y( P; c8 x2 j SY(end)=2020;
- Z3 d4 }- N9 c2 U. Y- V STR1(end)={HadISST1SST1};
# g+ k0 V. c9 w) l2 H4 @) X STR2(end)={SST2020};
9 k- w( T, A H* g1 `$ C' d6 k7 q4 n" \* m1 d4 C7 _
[rowsize,~]=size(SY);
7 ?/ }8 {: o: |/ k8 O- x! c$ R for i=1:rowsize
* I- a" F6 H* C# F* K; `3 n7 Z shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
& u, B3 ~( m5 s( k6 B- Y* G1 O end
- u; v2 L' P! W' z. C! T# ~3 @$ {
5 g% F+ Y# }2 o( K' z hold off# B( t) v7 E) C
close(WriteObject)
4 u& t+ a3 }$ p p6 K %%
3 g$ k6 C G: Y Z2 Z" {9 Q functioncbar()Tem=(-10:5:35);
4 L( H0 `1 A+ d$ [7 r1 w2 Q labcell=cell(1,10); %用于存储colorbar标签- T6 x; Q7 k1 C. W( P0 Z
for i=1:10' `$ |* g5 m3 D6 L& t/ z. ~
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};$ C1 y! x' i) J
end
% I8 ^4 m( u! h- j% a! r cb=colorbar;( H5 n- J6 F. x# P4 Y3 P
cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
- J# z! k, l' x/ e7 V, c cb.TickLabels=labcell;
' H4 D% J1 E. S$ z6 s/ M cb.FontSize=12;& M% m! q" f- ]
end; _" E% l; G7 c4 k1 ^/ H2 ]
4 s, }" D1 E4 G# o" R, c2 m
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
4 _* D/ Y- G) `6 h; N0 H- Z1 J eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
# L) W" S! \) q1 X n1=n1/181-1; %数据每181行是一个月的全球SST数据
: }5 T) `1 v: i; e" m. T3 w for i=0:n1
; D" Y( m6 m& U! G4 H ~1 h eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);0 W$ [5 n V! q7 |; V' G/ S# f
C(C==-32768)=NaN;1 B7 y' O" B" @
set(im,CData,C); %更新im的CData属性
# t1 b5 `2 N0 h. W# ?/ Y5 ?2 t set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
( o2 ^( \8 [+ @0 w, m set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本$ `) a2 h Q: V$ c# \
: M, u9 Q( D5 P& J% q frame=getframe(gcf);
7 t6 m- i( }% J writeVideo(WriteObject,frame);
* S% ~9 t. z. }: N* c end
3 V' }) C7 O( T* `: s6 g eval([clear ,str1]);
' D7 c: Z& u/ m5 v& _" T& `5 \ end$ A% a S7 {9 ]% r# b( G8 ^+ R2 H
% C6 M2 U1 x- Y% X8 _2 e
效果图:/ D% F, `! r! @, Z7 ]$ u, x& Z
F$ O* @6 z2 K" b7 P 数据来源网站: ; N& L! Y. a8 k. j# w" V M
3 q+ T2 h4 q2 {% H5 A (引用声明: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 J" U8 N/ ?% I: s' G 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
' h$ b2 ^# g& {9 Q, ~ : v! k& e( T$ z
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
& s3 @- Q! T. r6 ]$ f; w4 t! M 参考文献: 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! F6 X. \, Y' z# o& W7 }
1 n, t7 i1 e4 o! s5 X* N
' R: `/ t. M. `4 e$ |# D
6 m' K0 f3 E0 o Z1 P a( W3 V, i
/ J( _) P3 F' w2 w |