|
# Z0 K3 X+ e* N% N 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 , _! X, M3 e `) u9 d3 ]* `
matlab程序代码:
' c. b3 d: n6 K %对图窗属性进行初始化
w/ K e2 W3 p! J figure1 = figure(1); %创建图窗并获取图窗句柄
. W+ b! q1 Y/ N8 s( p SIZE=get(0); %获取显示屏信息% w+ m& d$ S, m0 v8 e k4 c$ s
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小8 C+ u) l, y' y5 N! b/ E3 @$ c
C=zeros(180,360); %预分配内存# E+ K# ?1 A$ W. k; \3 P/ |: u
SY=zeros(22,1); %用于存储每一份数据的起始年份0 J$ J: w2 z; B( t# w v- O
STR1=cell(22,1); %用于存储变量名
: ^3 L2 J+ U+ x STR2=STR1; %%用于存储文件名
* p2 r; w" R& n6 \/ P/ c clim=[-1000,3500]; %设定imagesc的数值范围
3 K, l" `7 C9 B# C! k im=imagesc(C,clim); %创建image初始对象
+ r9 r& C9 ]* c9 Y colormap(jet); %指定颜色映射类型为jet$ K% F* I2 @2 H7 S
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
$ G: I; @; u, L L9 A2 V9 Y title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);. y' }, V q2 w" R* m5 P
axis off
9 ]) ^; U" j' T' Z$ g% x; D hold on3 L9 B. J' [& ?
cbar(); %显示预先设定的colorbar
/ C- X6 n4 L. c) C5 m: a %% A2 x4 \& C- v. j4 b
filename = SST.mp4;
( ^* _+ C3 k8 S0 a: X fps=10;
t) n' W, ?, } B. R8 x! A0 _; ` WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象4 L$ w' r+ b- ?/ C: c$ k" e
WriteObject.FrameRate=fps;
# }% k6 A* _& @) e1 K WriteObject.Quality=100;2 }+ z! P9 |" ]/ {2 }) s% Y
open(WriteObject);& ?5 { c2 w% J+ |* z
%%
! h" U$ U! z$ z* M! O) U SY(1:5,1)=[1870 1901 1931 1961 1991];
6 ?$ v" z5 W1 H& P X2 ?6 J STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};. F- N+ S: i" E' E. ]& j/ T. F
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};
3 [4 X# P6 h6 r: ^8 o1 b. Q for m=4:19/ S, b6 u5 r' j; u' W5 c, S
sy=2000+m;" j9 t' U( S# G* F
str1=[HadISST1SST20,num2str(m,%02d)];
5 _3 s1 f% \# y) E* T: C str2=[SST20,num2str(m,%02d)];
a# s6 q: C% { SY(m+2,1)=sy;4 }/ D' p) o5 Z) L. g1 h
STR1(m+2,1)={str1};
* u, U* w9 T% r1 E% O/ @7 \ STR2(m+2,1)={str2};
+ }) x ~; g `* ]. C" Z+ [. }% Q end" b6 q* x" `4 h/ h- o
SY(end)=2020;6 ` Y5 [% {0 A( ^: @( e
STR1(end)={HadISST1SST1};# b S) }, t5 ?6 }# a o
STR2(end)={SST2020};- V- d& k0 ?7 s4 R7 p8 }, A
# ]% M* K+ C" H% { ~ [rowsize,~]=size(SY);
. [* {, i5 {( Y/ m2 H for i=1:rowsize- w& ~1 _7 m* C; X; i
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
& @, S- Q6 F: | end
$ _- v3 b- V& E1 P- [; t$ x# a7 k) O$ g2 _0 d
hold off% w/ m+ i% n8 h* F7 V0 J3 X; {$ g, g
close(WriteObject)" ~( ] b0 K: J; B' C5 d/ d
%%
, x ~) Q) d" G, z$ s2 M functioncbar()Tem=(-10:5:35);
- s/ q) h" o' x: E8 U e labcell=cell(1,10); %用于存储colorbar标签/ r2 ?& m0 u+ a& ]- {
for i=1:10: c9 L! }/ p ?. |* S0 P
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
- Q& G* v$ Z: o6 ]% {7 ]3 k end3 R, \( w$ j; f+ x) T: F) I* p
cb=colorbar;
7 S9 r$ x( {: h7 m% r& S+ @: v# M \ cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
& Z/ K% K; E; \/ q/ w cb.TickLabels=labcell;
, j7 ~8 }0 s1 z: I cb.FontSize=12;
8 |: L; ~' p7 c$ \ end4 v0 b% v+ p3 O9 `8 Q* v& L9 q
' V6 V$ ^! R- ^* k& A1 e
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);7 U2 R( h( \; X* L, R, H$ A M
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
# `7 Z% h% T8 ]8 @ n1=n1/181-1; %数据每181行是一个月的全球SST数据8 Z. {& h* u& F
for i=0:n1
0 i, y! a% y' F+ g7 S eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);4 h/ d7 {1 }, T+ C
C(C==-32768)=NaN;/ T" I- K5 P$ m+ `0 @
set(im,CData,C); %更新im的CData属性6 b0 b, M+ t1 g; ]
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
$ J7 g2 C% i; k5 Z" q0 W set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
8 {, ?3 M- U0 V- a9 d. x
! l; h" a2 g5 F. G& d1 I) _ frame=getframe(gcf);
4 n5 _" g. o- B; ]) a writeVideo(WriteObject,frame);
7 A H1 d, L8 [5 }9 ^" ^& O end7 |8 H2 R; t, t% d" a( i) }! ?
eval([clear ,str1]);, f# u2 r: _7 Y" H. }; W
end
$ n# P' d$ Y! e. j% X* w* R8 T
2 S6 s5 J2 [1 K3 B! g0 H 效果图:& s, v& a( t% w; V* q! U9 Q
5 ~: t, L$ m6 u/ O1 R8 U 数据来源网站:
$ |' {( j' J- G2 O+ N& s1 Z% n % \3 G# O* d# v1 P0 [8 W \4 R
(引用声明: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/)
. F! O* u) c% J; s$ o& a 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: ; I' c6 M/ Q3 M) `
* ~# W$ B9 ?0 _ 提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
" I" z& P1 U" R- n) }% M4 q) | 参考文献: 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- L7 V0 Q+ c/ v
6 H+ A( H8 h% ]6 } F- z+ p( a
( l1 X3 |. Z" l4 J; J
4 k3 u4 R, H5 t2 v1 h7 P
* m7 k/ v' k9 v/ a Q |