|
% f7 I/ [4 d `2 y 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
8 u9 n+ B8 z6 q# w4 D matlab程序代码:
3 R& N5 K1 a/ _" K %对图窗属性进行初始化
7 |& u) S# ], ~3 w figure1 = figure(1); %创建图窗并获取图窗句柄! c. s, V n9 Y* ]8 W! S+ h, l
SIZE=get(0); %获取显示屏信息
$ t3 I9 U1 A! ]; X% y set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小$ e# e3 A5 V3 s, M
C=zeros(180,360); %预分配内存" q6 |9 N( s) w9 D7 m4 T
SY=zeros(22,1); %用于存储每一份数据的起始年份
/ @8 X0 t7 U1 Q. O+ n STR1=cell(22,1); %用于存储变量名) u# O! h. S: R7 ]! x6 @! }% S0 [, |
STR2=STR1; %%用于存储文件名 U3 v7 B9 N# Z+ Y0 @
clim=[-1000,3500]; %设定imagesc的数值范围8 Y+ ?: T* `/ g% f9 \! V3 Y5 N
im=imagesc(C,clim); %创建image初始对象
+ u/ k! e$ f8 n) L" p7 G! ] colormap(jet); %指定颜色映射类型为jet* N0 S* Q1 f( u7 m& N- h$ L
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
9 h0 E& X8 e5 Z+ K3 x title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
1 a4 h$ `# S; i! a axis off
: X( d( |2 a7 j7 K ? hold on
* i3 f! N: k4 f! E; q cbar(); %显示预先设定的colorbar* J8 d7 |/ v, X- }
%%* e, h8 T: U- m- Z5 {5 v
filename = SST.mp4;
) q- W2 S+ i: i7 w2 Z W5 C8 P fps=10;5 d8 L( T: c8 Q7 g
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象" n, s, R1 a0 m, t
WriteObject.FrameRate=fps;
' H% z8 G+ W% z; Q. w( S6 S WriteObject.Quality=100;
" i4 L. h5 y6 r# `/ G open(WriteObject);
X% x4 I- V) t% x% V1 | %%
" k; T; S; i0 q9 x0 g6 H# F* n SY(1:5,1)=[1870 1901 1931 1961 1991];2 t% r+ a# Z, I
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003}; ~+ e. }, a! c9 \; w
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};8 D B4 V/ \9 |
for m=4:19
6 s/ X6 ?, p, \$ z1 [% F sy=2000+m;0 R/ X: i6 A6 \* O
str1=[HadISST1SST20,num2str(m,%02d)];
. Q* H3 i! ]. T4 f) U( e. Z str2=[SST20,num2str(m,%02d)];
8 V6 Y% F* T% ~ SY(m+2,1)=sy;- ~/ B" j8 s# r7 q" H) W9 b
STR1(m+2,1)={str1};
# D) a; v3 }/ X" ^. E/ @ STR2(m+2,1)={str2};) G8 @! _) H+ T
end0 d% R# _) A$ i$ C3 q' u4 n6 Z
SY(end)=2020; X& ?8 G9 ~. Z" z
STR1(end)={HadISST1SST1};
) b( _) Q0 D. t! h! F, E. B STR2(end)={SST2020};# ]- p9 j7 [, h
# u$ o; K( @0 M+ ~4 B
[rowsize,~]=size(SY);" f7 Q/ ~; {4 @5 ~. g
for i=1:rowsize
- \! E2 W, y0 F/ I0 W shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
2 E, j" y9 N1 l U! ` end, J" ~3 Q! t8 z; A, z5 a
9 l+ K) s: l/ H! }! S0 z W! m0 c, g
hold off5 M, d! n6 K0 D7 w V# a
close(WriteObject)
, H5 A3 X6 S0 \% j' M/ o" o %%
" h$ v5 e( `5 U8 d2 h- Z# s functioncbar()Tem=(-10:5:35);
: k& T$ q: n/ [2 g, l6 }6 [; o labcell=cell(1,10); %用于存储colorbar标签
" C* d) S# m9 Z* `0 Y& ]0 e for i=1:10, g1 E# p7 m4 x% b
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
4 b, A$ x l+ } end
9 v6 ]5 M# P6 K! S+ f) d9 H cb=colorbar;
, Y4 L& A& J$ S, z. a cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
2 c- \. e# ?- E% T cb.TickLabels=labcell;
$ S% ?7 B4 P+ t" [5 V, u. s cb.FontSize=12;; P3 p7 D' L( z
end7 h" N* }( Y6 {; h2 M
9 Z5 ?. Y* G, J) N; L/ f8 p functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);$ r; s8 {: }4 x( e6 a9 b+ z0 @
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句; O) ]+ b0 N0 d. s# [
n1=n1/181-1; %数据每181行是一个月的全球SST数据# K& }- ?) {, [1 L( R
for i=0:n1/ m( y0 z1 `2 m1 o1 b/ Z8 x4 q
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);2 A2 A1 p; f2 `5 s0 Y# M; p
C(C==-32768)=NaN;
! R- z0 q6 }! {* L set(im,CData,C); %更新im的CData属性
# _' }2 G z1 y1 R* Z- A set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度* J; ]! L, E3 ^* K+ r' M8 u
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
( S0 c) L3 z( P% @; G4 I& ^3 s1 u0 p* R0 X
frame=getframe(gcf);/ ]4 u. A2 ?/ \ i$ t. |
writeVideo(WriteObject,frame);* O( F- Z# n+ e# N k
end
: P7 q2 _+ U2 B9 g eval([clear ,str1]);
5 z Q/ u* p2 {5 l# c end
5 v/ F! r9 A9 M9 { 0 u3 R" z- }- ^. \1 `3 `
效果图:
. {1 j% _1 Y6 P
5 [2 V- N& e. c6 e Z 数据来源网站: ' ]9 j; G3 I" H: a
: X3 D7 j) ^2 q% x( Q& v5 s1 Q- [ (引用声明: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/)
0 J5 m. @" w, x. `1 N) c) ]8 y: z# A 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
- y. j4 C3 v: M- C$ r % K- h2 S% H* C) h
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) 4 L- c: c5 `/ l
参考文献: 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& m) a ~( P3 h1 y) h
$ ?4 I% m' u& |
! o5 W, h$ }1 l/ o
( v# u9 ?# Z7 j
/ y9 m8 q/ i. A0 o' A* j9 u
|