|
4 b2 d# R6 m: {. u7 | 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。
( r/ E' P+ h, B1 P% ^5 D/ x matlab程序代码:+ O# ?' f6 A% S6 f
%对图窗属性进行初始化
5 d; M& k4 m! g0 V( z: D figure1 = figure(1); %创建图窗并获取图窗句柄
# w9 B* F1 ]: U" k+ J) Z: I$ R SIZE=get(0); %获取显示屏信息- {1 b! X) Q2 y( R" J3 ^
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小 I3 t' S0 R# I& C
C=zeros(180,360); %预分配内存2 k6 ~" l+ [8 z, }- v7 m
SY=zeros(22,1); %用于存储每一份数据的起始年份4 Q7 A. Z8 V/ `
STR1=cell(22,1); %用于存储变量名
' M: l1 f, W* D) p! ^- B STR2=STR1; %%用于存储文件名
% Q$ ~/ Z" i9 o8 x8 b5 j6 d2 l. B3 i clim=[-1000,3500]; %设定imagesc的数值范围
: l+ p0 p) b3 r7 _# E j: S im=imagesc(C,clim); %创建image初始对象) G' K/ T5 i3 p7 E! D
colormap(jet); %指定颜色映射类型为jet
/ D/ `* q2 n7 R; r) L txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
2 s: E; J8 f3 r4 }2 W8 @ title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);
* a% ` X5 Q# z2 |9 \, G) P& W axis off
$ ?" t! o' ~/ R hold on* D, B% F Q. [% _. g% r9 c; L
cbar(); %显示预先设定的colorbar
& p, ]% g* @5 X+ G4 U %%
5 W5 r8 p& ^, I: v filename = SST.mp4; F* |& A$ k3 c' B9 K
fps=10;% H o( {2 ~$ X5 \# f
WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象4 j$ h% k' W$ C Q- F, P0 k4 y
WriteObject.FrameRate=fps;1 k: x& } L' {
WriteObject.Quality=100;
. C2 ~3 J- R( t/ d ? open(WriteObject);1 {0 k, h' u* j
%%
# z& c6 l" F) n6 D$ g8 @# M SY(1:5,1)=[1870 1901 1931 1961 1991];
9 r- g! o2 p/ {8 X! z" | STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};
) L7 g7 Q! v% A* |. ^& B STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};1 o- }: d! c0 p/ q+ L
for m=4:19
2 q- s+ d4 s6 Q$ R% g3 y. h: c6 a: d sy=2000+m;( o( g- \3 b! h- S
str1=[HadISST1SST20,num2str(m,%02d)];
5 [( X7 o4 Z& n& I8 _: | str2=[SST20,num2str(m,%02d)];; o" Y7 i& \! {/ ~6 P7 C" r
SY(m+2,1)=sy;
* _2 H3 y* W( q, a STR1(m+2,1)={str1};
' ~- A6 ~0 m+ u, H9 x STR2(m+2,1)={str2};
4 F2 G$ @/ A Y* n end
2 J, V. [( q; v% J" P% L- p SY(end)=2020;
3 \0 n% U* ~- `, N/ g/ R0 }- f; t STR1(end)={HadISST1SST1};
0 |! ~& g' O/ X7 `, R+ H) x STR2(end)={SST2020};7 a) ~% z: _. M0 G7 c8 T" {# r
* c& c5 N! [1 O: ^( O$ Z% i [rowsize,~]=size(SY);6 L- W; E! \ y
for i=1:rowsize
" o" y# H6 D& F' |% d shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)9 F4 o$ y! T2 d+ R, s9 b
end
$ V1 h8 L* S9 r9 S# a) B9 X6 R! R- x- I0 E3 B, D
hold off
4 E& g& M$ c% o( l6 [, w close(WriteObject)6 p- D) ]& x# i* [5 d+ y/ @7 g
%%3 ]+ D# C0 O* R
functioncbar()Tem=(-10:5:35);
2 a- o- c0 B& f# u r labcell=cell(1,10); %用于存储colorbar标签3 o# H- P5 e5 Q6 W) e9 ?; I
for i=1:10
! o) u, t0 @3 z5 U7 c! q; i( H8 ?& q labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};8 L2 o0 D' q8 u. f3 p
end( R) ]9 Q- u; g; |) Q/ t
cb=colorbar;
1 W9 q, q2 P9 t3 b( W/ U cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex. @% H6 m' e4 B0 Y/ _5 ^
cb.TickLabels=labcell;
' V5 b) ~2 i/ X# C, h cb.FontSize=12;' q( F6 c4 K) u/ ]8 U0 m% a1 P
end
2 z& q" ^% K& \" x5 u1 V+ s4 Q6 c7 w8 K
functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);% J* _- d. _' @; j& h
eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句1 y. c( i/ X9 ?( b# `
n1=n1/181-1; %数据每181行是一个月的全球SST数据1 c4 a3 X) w/ X
for i=0:n1
; z" ?5 r8 R# n l5 O6 g9 E+ Y% k% P9 V eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);. n' v7 w& @# t9 U+ F
C(C==-32768)=NaN;+ x( ]% _& c5 C k
set(im,CData,C); %更新im的CData属性
; P7 M3 W( D$ A! Z7 C( d5 g" |6 i8 R set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度3 [+ e8 t1 T, x" E5 ~2 w0 u L0 ~
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本
$ G/ Z7 r- ?, `, g+ {3 @6 e
8 m. y/ M- | X( F' a frame=getframe(gcf);
6 ? A* G0 [! j writeVideo(WriteObject,frame);
4 S- V1 S( c+ A( B& n# l end5 K: e3 J' F Y
eval([clear ,str1]);
7 R% b5 ~# y3 N, |& v end
4 ]) N" A5 \! }' j! m# S4 Y 8 V1 h, E7 L( a# f
效果图:9 H% [6 x$ c9 p
0 m" l A3 Z2 L 数据来源网站:
4 E' f P7 P( [. K! t . g3 k& D- R: W( Y. X7 u
(引用声明: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/) ( T7 z$ \7 R1 [8 `8 ]' S7 W
代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
5 O$ o$ u3 k% d* e
A# K7 ?% c( w% c+ g# g& v 提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
( R- j& |# |* E( s& {: f 参考文献: 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/2002JD0026707 i& m& R: @. g, {
) `% y: @- ^5 M- ?9 M/ Q/ r/ a" e/ Q% c0 W: p/ K4 v
/ R& T/ N! ?2 I/ n- B$ |6 `) u# v
; f: \4 M9 a. Y
|