|
) A# J% L1 l6 w9 l! o' U 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
5 w) e8 q# \# ?* T) `1 [. u matlab程序代码:! W& r5 s& T( b8 ^; j
%对图窗属性进行初始化
, `# Z3 n) M8 m. C) l figure1 = figure(1); %创建图窗并获取图窗句柄$ U: n6 w$ Y4 T4 I
SIZE=get(0); %获取显示屏信息6 Z" T4 ^% [5 `% Z- b5 F4 H- s
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
- k/ z: d E7 R) T. n C=zeros(180,360); %预分配内存1 Z4 b( o3 S" j% H
SY=zeros(22,1); %用于存储每一份数据的起始年份7 R6 O0 h3 H6 y2 M- {2 _
STR1=cell(22,1); %用于存储变量名1 w& U5 C8 W( \4 s
STR2=STR1; %%用于存储文件名& k [& H5 d% L: Z% ^
clim=[-1000,3500]; %设定imagesc的数值范围
! Y* W5 V* j/ G ~3 o$ { im=imagesc(C,clim); %创建image初始对象
! r9 i% ]6 ^' y/ S; n colormap(jet); %指定颜色映射类型为jet5 M9 l- ]& |) c% X- o
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
% a. f9 I% j$ b4 l title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);( x+ l/ f1 q) d, T% c
axis off j, m: G5 m. t" v: c* P: I
hold on
0 a; Z/ B* N- U% y' v cbar(); %显示预先设定的colorbar
( d+ p, A0 {. z8 S% M+ F8 z' p %%
7 o8 i! x: N. s. W filename = SST.mp4;( A/ b$ E0 _$ M& E/ R
fps=10;
5 Z5 P5 x, |3 y# j3 i. r" j& p WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象: J$ j8 u8 i ~: H
WriteObject.FrameRate=fps;
# h& ~; _7 J9 m, E, R WriteObject.Quality=100;6 O4 {6 ^6 D# ~, p
open(WriteObject);: F' J" F8 i+ d+ x
%%4 ?9 E# I5 T7 M+ R* a
SY(1:5,1)=[1870 1901 1931 1961 1991];' J f8 K+ Y1 ]2 [
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
, G7 I% U3 s% s, W, v# O STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};6 _9 x% S4 B" ~ z( c6 ~8 _
for m=4:195 A# y! T/ p' \( [4 w5 g
sy=2000+m;
0 ^2 K- a1 h6 ]: U str1=[HadISST1SST20,num2str(m,%02d)];
5 k0 C/ h9 Y( R* i str2=[SST20,num2str(m,%02d)];. E. ?- r2 C7 O3 z3 q m3 f) g: P
SY(m+2,1)=sy;7 J/ p1 C1 O6 Z: f
STR1(m+2,1)={str1};
7 B. z/ i3 d% W% q STR2(m+2,1)={str2};3 w6 Z* \- |/ N7 W
end; M2 T; c$ V( c/ |& A
SY(end)=2020;$ u1 n2 N. Z9 a9 U
STR1(end)={HadISST1SST1};4 `. u* |3 F1 g8 d
STR2(end)={SST2020}; `2 I4 g6 M5 W2 C6 Q* T
! N% y3 p' l# S3 l# ~* J& h
[rowsize,~]=size(SY);: ]2 g t6 I4 v
for i=1:rowsize
" Z: W% H" d, D8 ?5 ?9 u! I shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
/ d" F1 Y1 f+ M5 e* V1 d# P end
; i8 ^# p0 g: \0 h: w
) {; C4 p: C% ^/ B- ` hold off+ A' P/ D1 \$ J# E
close(WriteObject)$ {( `* R! N6 P# b! e& w- i' N# J
%%* n$ `# G; j1 @' R
functioncbar()Tem=(-10:5:35);
5 w6 F h; F5 Z- l/ m$ A labcell=cell(1,10); %用于存储colorbar标签
! ~. \+ Q3 C' j- K& E for i=1:108 H" v( Z0 Z5 `3 @7 z- T
labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
7 y1 F7 t1 l \- b Q end
6 j% c3 q( [% _ cb=colorbar;
* J3 Y+ h6 B& X- w6 ? cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
# I ~3 c8 c. k2 t6 G2 V cb.TickLabels=labcell;
! r6 `: `; e7 t4 ?* M; c9 \ cb.FontSize=12;2 E0 M2 Q V/ _" g& A) d/ v
end
6 B; h& M0 e4 i$ k' l
, y0 n/ @- e2 S3 R* s functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
0 P5 L7 g" m1 y eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
% R- i3 R: S& h n1=n1/181-1; %数据每181行是一个月的全球SST数据; m2 V0 G) p& ~' x3 Z3 I1 R
for i=0:n1
) r' h3 ? M6 d& N! [; a4 } eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);: a3 a+ w* r1 |( f
C(C==-32768)=NaN;2 N, a+ p2 _) w8 v. o. O/ a
set(im,CData,C); %更新im的CData属性
/ C' Q' a4 L' n+ _7 G. n set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
3 X* j6 M% {( {; |8 R1 N3 ?- ^9 G set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
7 u/ W* w" P3 S. @6 J" U
3 ~( N, t! r* ?+ F( X frame=getframe(gcf);# Q* y! z( P% d& v3 R2 K
writeVideo(WriteObject,frame);
3 E; X- f* t4 ]* k2 S" f, z5 L# ? end
7 M4 [6 f9 s" F L4 l8 W0 ^0 y eval([clear ,str1]);/ c. W3 H8 r a0 z
end
: E- g3 p+ I! b" d+ [* P% [ $ G0 V P# f! o5 B0 |1 F
效果图:
. N u1 s& ?# G
: t- ^! R( H+ I4 z 数据来源网站: % y& P6 J+ U: Z: e
Z2 z$ g# p$ o# S2 I' t (引用声明: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/)
$ V/ V, |# O0 c; s' k- D) [ 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
E/ X/ G2 C) `( B! _3 e
* s9 c, K' O/ w( t4 ], V 提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
; ]" j4 |+ w1 y, d: U5 V1 Y9 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
& L7 i/ B6 T4 C2 p6 h
* P& Y9 k. j) u8 [# o T9 f+ J$ Z s. ]) i) f+ Q# G
) u8 z# j2 K Q) ^
4 H* ?! p" L6 I/ Y2 v9 U* S9 x# |
|