|
2 ^. I7 w8 R- o 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
" L/ }; F* A# J) @ matlab程序代码:5 m3 v3 M' u8 q" e1 W7 c0 z
%对图窗属性进行初始化0 z9 C. e! q! F
figure1 = figure(1); %创建图窗并获取图窗句柄! v. H) `. U* Q. j& T
SIZE=get(0); %获取显示屏信息8 W( j/ l' }3 t; f
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
1 a9 O) i1 T v4 N9 k. T C=zeros(180,360); %预分配内存
& D" T$ c: s/ J& W/ k SY=zeros(22,1); %用于存储每一份数据的起始年份
) c3 @* I. `8 `' t STR1=cell(22,1); %用于存储变量名
# d: V Y5 i a) S; d' C. K STR2=STR1; %%用于存储文件名& h' M9 T4 ?! r
clim=[-1000,3500]; %设定imagesc的数值范围, x% c+ |" \3 \1 `- R2 V
im=imagesc(C,clim); %创建image初始对象1 X4 _4 ?* k5 ^
colormap(jet); %指定颜色映射类型为jet
# W8 Q; \9 i# l) l: o5 o txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份; G2 f% V/ ~7 {, L3 I- U% B
title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);6 x$ }9 @' m/ O* j( X/ N
axis off
/ Q) p+ q# n1 D- t7 S hold on
' R" S: c' G9 X3 @ cbar(); %显示预先设定的colorbar/ y8 |% a% y; D# G- Z) J7 E
%%
G! F+ [4 X. x9 l; j+ Z: b2 L2 [ filename = SST.mp4;: e' q9 W4 L4 C5 d
fps=10;2 Y- q" u- m0 u" E4 [* E" v5 q. `
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象
, Q1 L/ p6 P' C) M' O/ y* x WriteObject.FrameRate=fps;
: F; \# X" @$ H+ x* \; t WriteObject.Quality=100;5 G' O' [2 o: p
open(WriteObject);3 b/ E! F, X+ R$ o+ u" f
%%
+ q) o3 H( c, {- o: Y. W8 i SY(1:5,1)=[1870 1901 1931 1961 1991];
7 q3 Z# ~6 ?6 s STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};7 s: t4 o6 g! b$ {8 j* X+ D
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};
|; O1 C. f; R for m=4:19
- Z& L6 c1 G2 _ sy=2000+m;
2 J# {. S. G3 a/ w str1=[HadISST1SST20,num2str(m,%02d)];- [# D" H* H- {# I' T/ a
str2=[SST20,num2str(m,%02d)];+ B f: e2 F4 O. s- `' y$ T
SY(m+2,1)=sy;
; z- @* e; ?6 M) m2 w0 F# F/ G- ~1 y STR1(m+2,1)={str1};6 |* j9 P0 i7 d! h+ E
STR2(m+2,1)={str2};7 X$ x- U, d' |* I9 c! Q
end; h. q4 ]1 Y7 d: g+ C
SY(end)=2020;
% G7 j u) s; w: w3 A STR1(end)={HadISST1SST1};7 p* [. n- q" p. a+ h
STR2(end)={SST2020};5 Z% o0 L1 I" v/ ?6 z
: P4 M8 B1 ^1 L3 M$ ? [rowsize,~]=size(SY);
@) S' m! G0 X) \ for i=1:rowsize$ p/ E3 I- r6 f' L
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt), J1 D7 w/ ]- \# Q2 l
end
* a1 E: X7 ?- X G2 K/ m. {9 _
8 n+ G: }, m e7 x hold off7 ~4 U2 w2 ~* d. n# H
close(WriteObject)+ K1 J& n* F8 Q6 N' \: M9 H3 U& T' {
%%4 ?; o8 w% j6 }, P
functioncbar()Tem=(-10:5:35);! \% T. l& e1 ?
labcell=cell(1,10); %用于存储colorbar标签9 n* d2 Y i" c' M) H8 R0 U- P
for i=1:10; f7 \0 G& c2 M& i: l
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
( Y; N% L/ p6 m4 z end6 b. M/ H! {0 i
cb=colorbar;
5 N: Q$ e- [# f( L5 P- u2 ` cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex! A" X# a2 i, J f! x( S
cb.TickLabels=labcell;
' b% r3 Y+ q' {" N0 B cb.FontSize=12;: W5 X% S6 ^5 N7 N( ]% v
end
; y3 Z' N- z1 }+ w, j5 `8 h& K5 V
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);3 H- f3 L) x0 ]3 [
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
" t5 k' {( l7 |- a0 c n1=n1/181-1; %数据每181行是一个月的全球SST数据/ w7 y: f, M s
for i=0:n1, A/ t; D# M. K( R$ Y/ r# N* w
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);% M0 u4 W! C' K: M5 d9 V2 G
C(C==-32768)=NaN;
[, {. Q* @- [, J4 G1 s set(im,CData,C); %更新im的CData属性% S/ S: z* o/ C. x1 I
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度, {1 }2 W5 h, c) L7 R8 E
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本# N6 ?; Z- _: j
1 D& L4 S: ?) K. Z
frame=getframe(gcf);
/ K* J; E: U0 M writeVideo(WriteObject,frame);
9 s4 O% O' v/ @5 C. n4 R: J) E end
0 K c" y6 W. t eval([clear ,str1]);+ c; |1 m3 l: D( t# e2 m
end
& I: I9 v$ z H9 w9 U: f, f1 e4 {
' q" Q* L/ Y% x 效果图:
0 ]$ Y9 A& |! T
0 }8 [! W, d _0 F- x( M& [ 数据来源网站:
6 Y3 ?* h; U) J% B$ \, l
s2 x# D8 a# M" L* 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/)
+ M; O. z8 \2 c( C7 M 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: 1 V, S0 o6 P4 y
+ b: k3 m( _2 y( F' }
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) - t, T% u, L8 q% n/ u# ]
参考文献: 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" |# [( f* y$ ]. [( v
6 l6 P a+ g" X- X! J
+ j, V; I0 h5 B4 o. A/ f, k, F8 r, A0 g9 `; T: o1 q
8 c) D: W: p; b( n% w5 K
|