|
- k g( ^2 h1 O 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 - z1 H6 E& q. H* U
matlab程序代码:
' q/ P$ Z4 y9 I1 G4 g %对图窗属性进行初始化
$ o3 f+ t% M4 r9 d" Q figure1 = figure(1); %创建图窗并获取图窗句柄
; r6 S2 q7 O5 ?: U SIZE=get(0); %获取显示屏信息
! [3 u- }: Z/ x7 T$ {1 L; q set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
6 x' d/ P5 e8 N5 ]& E C=zeros(180,360); %预分配内存
& o2 D6 P' M, ?$ _- b! F SY=zeros(22,1); %用于存储每一份数据的起始年份7 s: [( {5 \& [6 {; ]1 e
STR1=cell(22,1); %用于存储变量名
- K1 u, T/ u% l2 Z STR2=STR1; %%用于存储文件名
7 O$ x4 i, `1 T& E% n clim=[-1000,3500]; %设定imagesc的数值范围" Z+ V5 \- Z- O2 e1 a& I; d) h- u& o
im=imagesc(C,clim); %创建image初始对象
) u# B) b! R$ N2 N- c colormap(jet); %指定颜色映射类型为jet
0 S4 z; \6 _# N; W' B2 f# E3 |4 g txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份& ^+ M0 [, A5 G
title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
; V+ x0 m4 {/ n7 y/ ]9 c" ~ axis off, ?8 q+ a: M; [, w* v
hold on
- K! ]8 N5 t- y4 Y" K cbar(); %显示预先设定的colorbar
1 E8 w4 Q8 p6 U+ X+ i %%9 ~8 ~4 B& l7 x; k+ T' ~
filename = SST.mp4;2 H+ h2 ?2 |8 z* |+ }7 z
fps=10;
- m u" |* Y8 p. I9 [8 ~3 V2 d# X WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象# M( p4 ^, |/ R' w0 ^
WriteObject.FrameRate=fps;6 Y) z! Z5 q4 z) D6 |
WriteObject.Quality=100;
q5 ]% {. Y) v& Y d6 ] open(WriteObject);
0 T3 G# A3 {) k %%, [* r1 X: l2 h9 ^5 [2 A8 u9 I
SY(1:5,1)=[1870 1901 1931 1961 1991]; c6 q' d2 E- W& J% ~
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
. c9 w7 m! a4 j) x+ ?- V+ J STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};% J0 c4 Y+ p' r; X6 N3 b
for m=4:19
: W+ g7 c' J! v) r" w sy=2000+m;3 B+ H, q, v: N: ~4 {/ H, q" i9 y
str1=[HadISST1SST20,num2str(m,%02d)];
/ v& ~- B! q5 c9 ] str2=[SST20,num2str(m,%02d)];1 v! j/ V6 Q4 O6 }8 G2 O
SY(m+2,1)=sy;& f- {2 [* ]( U
STR1(m+2,1)={str1};# g7 M% q0 R! J7 o* G5 D
STR2(m+2,1)={str2};
4 P9 P2 u$ ?( U7 Y0 h end. I- w" I4 U5 K% x
SY(end)=2020;
8 R5 W* @4 m. z3 ]" j STR1(end)={HadISST1SST1};
6 p+ H. h* }- o STR2(end)={SST2020};) U1 ]( A$ c' D- c/ ?- X
$ P+ S- `5 N m5 \ [rowsize,~]=size(SY);
, u5 C0 `$ a' `6 H0 v for i=1:rowsize
% `6 r. ?, k1 G0 s8 D9 }+ U shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
k% ~* w$ a" y5 |7 m0 V+ p7 g end1 g9 G8 q: Z8 ?8 `7 N
1 h" Y7 v1 h4 Y
hold off9 ^+ |, _ s; |: W6 A O) g
close(WriteObject)
& \# D G# i0 _5 Y %%
! l) a+ I8 ~$ l) Z& } functioncbar()Tem=(-10:5:35);
/ V3 r9 G5 I: Z/ V& H* I7 o/ d labcell=cell(1,10); %用于存储colorbar标签
4 Q# Q8 N5 G& A; K for i=1:10
r" w: M4 \* n labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};9 s j/ Q) `# @ Y6 U6 D# k5 |2 R
end) o$ T, s I2 F4 u
cb=colorbar;/ X! L: M- ~) i, \' p
cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex5 F. e, Z3 y2 m5 t8 b& a8 V
cb.TickLabels=labcell;; e* V" x6 A& j/ E
cb.FontSize=12;
- k; M; \# S" m* H9 t9 o* ^) ?( e end. s" b3 c1 N! M# ]9 k& B. e
2 n; Q+ R; j- P2 I7 a0 ^, E functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
' o8 m' u4 ~" {! }4 v) m I7 P eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
* [9 f" A3 _0 W/ u n1=n1/181-1; %数据每181行是一个月的全球SST数据
& x" U0 F' k# U& g+ B2 | for i=0:n1
, a( D( L" q6 V1 X. Y eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);4 t% U6 Z* A l- g1 [
C(C==-32768)=NaN;
0 ~3 d% V" X9 F! ?) a8 i4 e! l set(im,CData,C); %更新im的CData属性
/ S0 y; K @) n! q& U set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
8 K& ~5 p1 k! o6 ?5 P. M1 D set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
6 T# g9 `& ]9 f% e Z, m7 M" V: M9 t, F$ D" S
frame=getframe(gcf);
) N7 a( `8 o/ D% P( W- b6 w+ G. m writeVideo(WriteObject,frame); G" X @! V4 N, t7 @7 Z' S4 p
end
$ A Z. @+ R8 ^1 B5 l0 h: G eval([clear ,str1]);7 B! v" ~6 S; b( N: u
end1 A6 ?* C3 X- _- F- P
. B9 b4 X, C2 H4 @% m# ? 效果图:
( `! F- L+ [ u+ d" r ; a* z- N: w, v- K, |: ~
数据来源网站:
9 q# D X4 a/ g# m4 J4 @* G. Q
, A( {9 j b. x8 N9 r( N (引用声明: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/)
/ }' U8 A z0 H$ M0 L0 X 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
+ ~- g6 U, V, G% W 5 j8 J8 L0 d5 N$ I$ }2 ?' B, P
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) + q7 Z7 r' p$ `( o6 i9 n
参考文献: 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
6 M$ W w* X4 \& }' y' R* f* C( ^5 a9 \; F$ [& z. y
1 l/ K ^; h2 l, m
3 x; N8 A$ q; l0 v
4 \, @* w& T4 H: S" A. K" S4 V |