|
. X& w9 y( _8 d$ e- f0 B
最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 " S2 t! q! R4 B! V: U
matlab程序代码:5 |1 l; g5 K( l; E/ J
%对图窗属性进行初始化
! N, A! j/ h9 {* [4 } figure1 = figure(1); %创建图窗并获取图窗句柄( K9 Q, U" K$ |. W
SIZE=get(0); %获取显示屏信息3 i# L# m( L3 ~3 y: P. |& m0 P
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
( P+ [6 z; x+ u1 b& k1 w. K C=zeros(180,360); %预分配内存& E; ~) K& t q8 m6 m
SY=zeros(22,1); %用于存储每一份数据的起始年份
& E7 L" A, G1 t% y$ [( E3 X# x6 [ STR1=cell(22,1); %用于存储变量名; m4 q" [3 d" Q9 e$ y# F- [) X
STR2=STR1; %%用于存储文件名# B" q6 c' j! ~4 J5 l
clim=[-1000,3500]; %设定imagesc的数值范围
7 w8 ?2 p$ L$ N- W* D im=imagesc(C,clim); %创建image初始对象" R, P- o8 Y; z9 L ]
colormap(jet); %指定颜色映射类型为jet
; w5 F; y* F P0 s* k+ e3 S txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
) u/ A3 x2 V& u( H2 i" b) I& x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
% f1 o7 d4 [- F/ B0 h1 J' _7 e axis off& P1 y3 a9 C. f' }# r1 A
hold on
7 B: M7 T- x6 k) C cbar(); %显示预先设定的colorbar
8 d6 b4 ~$ S! t) v/ E! |! X; Y% M %%( x$ r# H u, r* d, f% t! w
filename = SST.mp4;! ]; q2 l ]# f. r
fps=10;
9 K# r& E! i3 e( L, T WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象) B+ o% T; E9 p' a) R
WriteObject.FrameRate=fps;
' T K0 x7 g% T! q' j7 P& @ Q7 Q. |5 g WriteObject.Quality=100;7 K# f; G9 G& a) G
open(WriteObject);
3 Q/ W6 t' s& d6 f- C %%6 x4 V/ R3 ~3 y5 E4 C
SY(1:5,1)=[1870 1901 1931 1961 1991];) S" R- n. f- W' p8 U; _6 D
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
+ y! h; M6 _7 i1 ?% Z; W STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};' `/ k Q& d7 O5 _1 }' G5 F
for m=4:19
a7 e1 h. u4 {+ O+ t9 F sy=2000+m;
* n, ], f, X, [1 s str1=[HadISST1SST20,num2str(m,%02d)];+ V# {; B. r* f5 l2 _4 S
str2=[SST20,num2str(m,%02d)]; [7 i! t1 }. z6 X
SY(m+2,1)=sy;6 P& l( U# S( Q; j
STR1(m+2,1)={str1};4 Q) Y* B3 O! F, p5 s2 B: u
STR2(m+2,1)={str2};
* A5 w9 \& I' l, G3 B5 L end
6 n: F! d; j: M' S( u6 t9 Y( j SY(end)=2020;
" ^) h' @' k! C& s) x STR1(end)={HadISST1SST1};
& b1 T8 X2 x6 m. g STR2(end)={SST2020};- m- o/ Y2 v5 [+ w
& z; N6 b6 Z, z$ f: V
[rowsize,~]=size(SY); u0 z* U# t- r3 w/ {2 T
for i=1:rowsize8 e4 r$ o2 J0 g# i5 G( P( n
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)2 i2 p |, M) a' Q
end
) _; a* A) p6 X1 {9 _* z* W6 e7 m2 w( k% y1 ?! @
hold off
& D( s2 ?" k( _2 H' H close(WriteObject)
; G9 Q( P* X, k% K %%
7 J1 T2 S( J9 V* @8 ^( s5 U functioncbar()Tem=(-10:5:35);
! \2 O K; d% e, k labcell=cell(1,10); %用于存储colorbar标签& W/ L- e5 ~7 _, H
for i=1:10
8 m2 S% X Q% t% }- Z8 h labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};4 N7 g+ j1 o. t* K6 P
end
# ^7 v7 R. R0 X cb=colorbar;
( g' r* r2 @/ Z" }4 N i7 @# k cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
% T3 ] j) N$ R8 ~- l cb.TickLabels=labcell;# D: H: X) S3 k$ @$ V! S
cb.FontSize=12;# L% j( w4 n2 ?; Z! y8 F
end
5 V3 { k# S/ P+ p4 W1 p+ a; F) g$ F% m4 ^
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);& o( I, X7 f0 C- B& H2 H/ i) G
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句' o8 f7 ?+ q1 Y4 W
n1=n1/181-1; %数据每181行是一个月的全球SST数据
( H$ d1 k- q) Z5 s6 W9 J for i=0:n1$ U$ G/ @, O C
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);( a. g8 I4 k) ^$ u& C% {
C(C==-32768)=NaN;
: n4 B% Q; G' m9 D6 q7 e+ Y4 F set(im,CData,C); %更新im的CData属性8 @' i6 }5 p' I1 Q
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
4 \! `$ \6 `1 t: h4 N( [, W set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
3 @& M( O5 l7 y5 G/ {/ j/ s: }' `; L( b6 L" `
frame=getframe(gcf);4 ]& N6 {7 J* l G! ]+ F% J; c
writeVideo(WriteObject,frame);0 z. k* g% J7 w
end
) R$ ?. p1 S( \ eval([clear ,str1]);
0 @( M0 C2 w% m6 c end
) E6 _3 q9 i0 J* M$ r
6 U4 s3 a0 f) q0 m7 E! ^ 效果图:( e( @7 Z% f+ p- C
9 E3 m3 a# D y: A/ ?: K: n 数据来源网站: 3 e9 V0 k' C) B w) r
2 f* B. O; _$ 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/) ) E0 m& y; D5 j3 v& w2 s/ m
代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: 3 m. i& R3 y) O. q2 t: V* A8 K; A/ j
B6 ^# A4 T' U1 U: |- B
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) : K* ?9 u+ l: P1 B* [
参考文献: 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" J! W3 C4 G' d o5 t" Y% |
( {- s" ?; t4 Q6 a. o) d) R. e' J/ [" z, I1 {
6 b, H# I8 H d: p' q
2 Z2 T+ v4 n, t! n
|