|
* a7 F$ M: h( Q3 G& _7 U' N4 t 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
* T1 i) G8 a* _. ^3 V( w matlab程序代码:
f; c( E: X2 ]# H %对图窗属性进行初始化) j) \% y* i% |: d. l% [4 L( `1 Z
figure1 = figure(1); %创建图窗并获取图窗句柄
" E F! H/ L, G7 X- K8 K SIZE=get(0); %获取显示屏信息
+ X1 n6 B# c, t8 i w9 L9 [ set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小0 A% P! a" F) O+ q
C=zeros(180,360); %预分配内存3 ]# g3 Q' S9 f! |3 w! o! S
SY=zeros(22,1); %用于存储每一份数据的起始年份
: T* `" g( f; K1 f. T, p STR1=cell(22,1); %用于存储变量名
c9 O/ u+ k9 ?' I8 D STR2=STR1; %%用于存储文件名
+ }0 K. O3 i$ s8 W9 Z9 D- f clim=[-1000,3500]; %设定imagesc的数值范围* t4 j- Z3 D" F& p) r( w0 x
im=imagesc(C,clim); %创建image初始对象/ g- a8 }- P. ?0 @7 c
colormap(jet); %指定颜色映射类型为jet
' Z4 |4 M, D& ~6 }% f/ W txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份: _& N* T6 H8 f8 h
title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);8 T0 C: d9 m& [& d2 Y
axis off
+ F/ Q7 `' O4 f* Y# I7 [ hold on
1 a/ |/ d5 |& r, _7 U/ P cbar(); %显示预先设定的colorbar
0 L3 X6 D+ ^' j( \* h0 o4 V %%
8 q- E5 v$ \# ?$ x4 a$ {. b/ d6 [ filename = SST.mp4;
% g6 ]( B8 H, ~4 M' X$ ^ fps=10;
1 R1 R) r7 n* i! ?# G+ x WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象
" w1 t; |! o) C+ `- ?( \- ?" a5 v WriteObject.FrameRate=fps;5 V' a3 f9 ^: t5 b3 ]
WriteObject.Quality=100;
/ x9 ]) V# m% `; R" s- e open(WriteObject);* n) z; T! ]: x1 f, g3 M- d
%%
/ i8 J# a3 J2 O2 R. [ SY(1:5,1)=[1870 1901 1931 1961 1991];
7 u1 U4 M. h& N( H2 { STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};' w5 D0 E. [" @) B3 c5 _( @- ^' i
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};
# l; ]6 q4 p4 D- h for m=4:19 M! ~/ M+ W7 U
sy=2000+m;6 x1 X: a4 z/ s. m/ \
str1=[HadISST1SST20,num2str(m,%02d)];! w( h- X9 V' X- q. L
str2=[SST20,num2str(m,%02d)];/ _: J7 ]5 G* v
SY(m+2,1)=sy;
" {* E! W* ^( A5 G STR1(m+2,1)={str1};
2 W- s, @ s0 o9 A( @ STR2(m+2,1)={str2};
4 O u: U4 U( I& K+ ^ end
+ L4 M- z {& I1 @) n SY(end)=2020;9 y) d4 B4 M) R" j
STR1(end)={HadISST1SST1};) s& F7 a" s% e8 c3 n# R, p3 Q* }- u
STR2(end)={SST2020};% b5 r* S' H1 G+ U J6 C
+ U9 _# Y/ y2 d" q n6 [ [rowsize,~]=size(SY);
$ d3 N) V+ V5 j: G4 v9 { for i=1:rowsize1 \, P8 |1 ~7 W0 K6 q0 r/ m
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)7 @# D7 Q9 m" [- H6 v& G, L
end! M3 C7 d/ M2 O1 |3 }
8 j+ ~6 h7 _" y6 Z4 o6 _
hold off
7 a6 A5 a; z0 _( U3 X2 T: f close(WriteObject)
$ u5 N) s# Q6 \6 U' J, ?5 j3 {5 y% l %%# Z% o. i+ e4 D
functioncbar()Tem=(-10:5:35);
, V# {2 }' J+ [& k labcell=cell(1,10); %用于存储colorbar标签) o' F7 W; H1 W. C
for i=1:10) I0 Z! B0 ^' v Y7 \: S
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
; {- W4 g/ W, x8 y end. j6 V4 |! u6 p6 w; j, F2 L
cb=colorbar;/ v$ {/ z5 E3 z
cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
/ ^ T- ]2 k9 W" v6 ~ cb.TickLabels=labcell;5 @( g8 W7 i, }# O* M
cb.FontSize=12;
/ g: P* J5 @& H' l5 c+ G end
( ?9 t0 \$ c0 i2 Z4 [3 l `8 C5 q' o, M7 R# S
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);. T, T$ I+ n% s
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句* t* T3 v- A* k/ N2 |# W
n1=n1/181-1; %数据每181行是一个月的全球SST数据
: F( g2 \- H( M4 B for i=0:n1
4 L h7 U7 H5 k" b. W eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);
4 T6 Z) }0 C# p7 k9 n C(C==-32768)=NaN;3 h' I0 o% i( }9 \
set(im,CData,C); %更新im的CData属性
+ f3 W0 i# b6 Z+ C0 P set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
6 l% X: d6 }+ [3 i, c: r) Z) { set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本; Y I8 d! F! r
& \0 H! F* [3 M. t
frame=getframe(gcf);! D) J3 e; z( A3 q
writeVideo(WriteObject,frame);$ [1 w+ S% d, q2 I z7 S
end
; k. U2 f# z2 T& X- u eval([clear ,str1]);
, n2 s9 o; N) N& R" h end/ `, g. D" c5 H$ P) S
. U" a7 A* S! J, e J 效果图:% C4 q& }% u# [+ R" Q
% i2 b A3 t! J3 b% M: h
数据来源网站:
% H' ]& E8 Q# E# _* q
$ w1 K$ y" e* Q b6 F% A (引用声明: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/) 7 V' G$ N9 I# B, a, o) Q
代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
% x. R7 @3 W0 x0 ?# u& e" t
5 m) _8 s+ t, f! Q1 m! ^8 ~: \ 提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) 6 N. K( a) F# d# U- K4 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/2002JD002670. t' I+ L2 ^: ]0 P |
% |9 h! D" k9 ?$ ]) K2 o( z7 G0 K+ e) L2 B, s9 w/ o
0 @5 V6 I: E3 _: W, p
4 q/ `% Z( H4 u& `( O3 D
|