|
f5 i! k @2 v& f1 _ 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
8 a/ Q; [! C: I% {8 V matlab程序代码:* _! g! W$ k7 v% p8 \
%对图窗属性进行初始化$ K, h. g9 Z. C2 _' a5 s* L
figure1 = figure(1); %创建图窗并获取图窗句柄2 }9 n" _5 F5 r0 K9 E3 Z
SIZE=get(0); %获取显示屏信息
6 v5 u$ _* I# |* w3 C" \, {# N set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
/ }" Q! h9 U2 M6 B, S- Q/ f8 l C=zeros(180,360); %预分配内存
7 W6 v2 Y& M3 {, J& g" F SY=zeros(22,1); %用于存储每一份数据的起始年份* u5 ^; ]- }1 \$ A7 X
STR1=cell(22,1); %用于存储变量名
7 c0 v2 F' P+ R; A; ?( d: H! Y STR2=STR1; %%用于存储文件名
# [. s- N; K, ]* r- R clim=[-1000,3500]; %设定imagesc的数值范围
/ b5 Y# X) t9 [( \ im=imagesc(C,clim); %创建image初始对象0 O6 m+ o" i. M" E; @
colormap(jet); %指定颜色映射类型为jet! n1 _( h- X5 r/ a; g3 ?* Q
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
& g! d2 Q& G9 v: O! ~% G# ~ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
, Q( l3 x8 L/ ]6 O6 G: ^ axis off
# d7 \! M) H6 h& \$ R2 k hold on; y7 K$ f- G5 d" `9 f+ w
cbar(); %显示预先设定的colorbar
0 ^ m4 n/ n1 s- n/ E/ C %%& W( [ t6 I5 l8 h y. P
filename = SST.mp4;- W; \# \+ S) e0 v4 u' d1 E
fps=10;. T1 u% y) j6 n* _# _. g/ D- j! F
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象& C- G, F' `( @8 R& Z
WriteObject.FrameRate=fps;
/ \8 V. E1 J( W4 U0 y' {; R WriteObject.Quality=100;; o+ n4 F2 d6 ]# L0 F; g
open(WriteObject);
: G! M, Y0 E- R %%
9 i5 X, E( S5 `- o0 m+ r SY(1:5,1)=[1870 1901 1931 1961 1991];4 b3 }2 D) D4 R9 B
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};2 k0 G4 }: H# f2 ?( Y: j7 [
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};/ I+ O3 O+ x. | a
for m=4:19
5 W) d6 }1 F( H- R sy=2000+m;
7 n0 F: C' I0 u9 ^- `+ p str1=[HadISST1SST20,num2str(m,%02d)]; V) o" p" ~. ~" i
str2=[SST20,num2str(m,%02d)];
+ G% n* Z3 ?1 s& M; ~ SY(m+2,1)=sy;) S5 L+ f$ h( L; a$ a
STR1(m+2,1)={str1};! i _1 Y( o, q9 z" e
STR2(m+2,1)={str2};" R: N8 n4 ]! j n. a# [
end: @2 p4 h s4 Y% k6 U6 T
SY(end)=2020;6 q# z6 U! u+ j" s5 s6 Y
STR1(end)={HadISST1SST1};
: L; v5 e/ G+ B- z! P4 ? STR2(end)={SST2020};& O9 ^! R3 p6 p) O q) y3 \
) W n" G5 H9 d
[rowsize,~]=size(SY);
. y( y0 L+ b4 C- I for i=1:rowsize
0 d6 U5 H0 N9 J shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
; O4 v- I' P; N2 ? end
+ _1 T# u* ]) H& |% [" `& ~, w
, }; Y: j; } h4 y$ \! \8 ^+ N/ s$ j hold off
* t5 R8 D1 _3 D1 K5 X close(WriteObject)
9 l X8 ?5 k' c; X5 V; ?; ? %%& }/ @5 v: N' G* ?2 k5 c
functioncbar()Tem=(-10:5:35);
- Z- {4 X5 b8 _ labcell=cell(1,10); %用于存储colorbar标签
" G, x; ^9 i" l0 I6 M for i=1:10
( w( b4 p+ ?4 Z2 e* ]8 J labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};+ @1 C# z7 [* \4 S9 B* p% _6 \
end
9 q$ c& a* { z8 x) m% H8 f9 ?+ \ cb=colorbar;1 ?3 Y# ^1 Y0 ^/ q' q
cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex1 D& d2 u; X+ r- r
cb.TickLabels=labcell;
5 P7 x: a% W" j) B( s* q cb.FontSize=12;8 W- H8 x0 H+ [
end
7 A0 y; n, P; ~/ y7 V( L0 N8 f5 y" \' T; g x' t9 @! q
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);6 Q9 ?3 o; X6 P' c' ^
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
D) j( T1 p7 ]4 A, e n1=n1/181-1; %数据每181行是一个月的全球SST数据7 ~6 w3 [) O: k
for i=0:n1' W9 ]! m+ A0 G, {4 I' X9 M
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);* P' n& ?* m4 z
C(C==-32768)=NaN;; O0 {; d6 j! Z! d/ L4 j
set(im,CData,C); %更新im的CData属性
. H4 Z6 r# J8 v$ L set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度$ d( C4 Z4 ~/ L
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本1 ?$ w) f4 R4 Q+ W
$ v/ |0 N( Z* p1 i% z0 T frame=getframe(gcf);0 g# S6 e5 V' ?& v* K* Y3 w. O
writeVideo(WriteObject,frame);- s, E9 } \3 A1 X+ ]- ^1 x
end. J" w5 I* n' y7 t6 {
eval([clear ,str1]);
* g' E2 s$ @! Q ` end
% p0 |, ]+ V* J0 E5 |6 G+ f & C9 v8 g, _1 I3 G8 f6 X
效果图:
/ Y) V) k" b) x$ M4 Q. O! [- K; ?8 p 9 {' O, _9 ?# O7 i4 c) }
数据来源网站: 1 ~6 E, M1 u3 m l1 k" n" ^
$ `" N2 u8 c1 S! W* ?+ 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/)
1 J' F+ d, r: m3 ?: R8 y6 Z 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: 9 j# U i2 r! S8 x y; j
' C8 g! S5 B" D7 z
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) 2 @; ~ I! a0 a/ R
参考文献: 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/2002JD0026708 R0 `8 a w, R" {
, T2 E8 e: h4 }8 a( O% e' K+ ?7 r& [; D4 {" m
0 L# j; S, ~ e& F- ~3 e) D! S {. | g# ~. x
|