|
" M' o( k x( {9 `" O 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 . N7 G$ q# q- R1 Q5 n& D
matlab程序代码:
5 ^7 E* t# F9 J! g %对图窗属性进行初始化# T0 k: p. s! c' y
figure1 = figure(1); %创建图窗并获取图窗句柄
+ l5 M8 K1 O: s! Q1 ` SIZE=get(0); %获取显示屏信息
) R' {, {6 S" y) ? w d set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小
; n0 }7 i, l, M9 {% C C=zeros(180,360); %预分配内存
3 B% N9 e C1 [) s- P SY=zeros(22,1); %用于存储每一份数据的起始年份
; \* E6 s6 q6 N1 P STR1=cell(22,1); %用于存储变量名
/ d6 H& T' G+ Z }' _7 o" I STR2=STR1; %%用于存储文件名
. H# ~$ g4 Y2 P, T A. k9 a clim=[-1000,3500]; %设定imagesc的数值范围
: K. s- ^/ p* L9 m4 n im=imagesc(C,clim); %创建image初始对象
C7 E( q/ U8 A J9 G: b colormap(jet); %指定颜色映射类型为jet! r) }) t8 x: C1 M( R
txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份- W- \7 X( Z( r* K
title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);: d: x/ d8 C( [) A: r/ P: U4 ?4 ^
axis off
. r: q4 n- W [: [2 b; e) Z hold on
3 Z1 U1 f2 n7 c8 N# [# Q+ g/ M8 @9 i cbar(); %显示预先设定的colorbar/ v$ ?3 Y- u& h1 q4 j6 r
%%. y0 e1 G* ]3 ^. v( i0 Y" K
filename = SST.mp4;
3 U* X' l9 }( T' O9 g. L& x# _ fps=10;
/ h. |7 a2 A5 R% M9 u( K; c9 J. p+ G; e WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象( j( b! X1 j$ ^; L! L2 N7 i
WriteObject.FrameRate=fps;* S5 z8 }! T4 d. {. i
WriteObject.Quality=100;+ x1 p) j( ^/ [
open(WriteObject);4 p1 b3 P5 T7 Y* A2 g6 c8 Y6 N
%%1 C# Y8 D7 l+ F) r# x: p
SY(1:5,1)=[1870 1901 1931 1961 1991];
5 f: n( c) t# K* f0 v7 z STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};9 U; K9 |9 E( o8 y8 t0 O
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};
; L: _0 L; M$ [3 { for m=4:19" @1 _7 x% W B( N, h
sy=2000+m;
+ }; F& c9 p( N% l( u; X3 e) U str1=[HadISST1SST20,num2str(m,%02d)];
. T. K4 l) Y( \+ e str2=[SST20,num2str(m,%02d)];
- `: w5 ^9 {0 S& \" u SY(m+2,1)=sy;
' Q* e- ~+ s! ^. A; Y STR1(m+2,1)={str1};
0 k1 e- N. r' I. l1 x; w! j& ` STR2(m+2,1)={str2};* @. k1 |2 l D( }, X. e# m
end
2 \, _& W" E* K3 N* `% ] SY(end)=2020;
5 f6 u6 ?- Z0 T' b$ r* U STR1(end)={HadISST1SST1};
) ]4 H* w) Z' C STR2(end)={SST2020};. y N5 @' h. Z3 r
9 C: p) |2 w# I* `7 n [rowsize,~]=size(SY);. ]/ J/ P) o; r! i: Z$ e0 A
for i=1:rowsize
7 ]0 V2 X) i7 I6 y x1 i shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)1 x5 B/ i& a, m5 P
end4 M1 m( h; @) p+ _. f2 i g
* w, p& G; K D/ b; e% Q hold off. ^; v# Q! t/ r
close(WriteObject)/ m3 c; c* f% c6 A
%%7 {+ \& a- ]! q1 y9 g
functioncbar()Tem=(-10:5:35);7 @* x! X* E! F0 r2 w
labcell=cell(1,10); %用于存储colorbar标签% p/ f4 `2 I8 W
for i=1:10
- H" a! t' Q4 a* M Q" X: H$ h labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
* |: ^ e& S2 l6 N9 u end; x7 \6 N6 p. G; W7 o& f8 p: r
cb=colorbar;- F7 r! g9 K3 S7 d" V1 R0 S
cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
7 z1 e; ~4 R2 w- l8 P6 C! U s; O cb.TickLabels=labcell;
" s% H, ]+ l+ h% q( ^0 m4 I cb.FontSize=12;
. G# }& z4 w7 g1 E* e. S- r# s5 x end
$ B7 ^* O# K& L# b6 i
8 `( ]+ s9 G3 V9 N8 n8 J functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
) N" x9 b( M) _: \3 s5 x! q3 ?5 L eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句* H; ~+ _. g; {7 u. [% w( R0 I
n1=n1/181-1; %数据每181行是一个月的全球SST数据* P- w+ A; M: w! B
for i=0:n1& I% y: i |; {6 f3 I; e) O; z+ s
eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]); {/ }( u7 p. M, w! ?
C(C==-32768)=NaN;
5 w& B! l2 ^, U1 K& u; m& [ set(im,CData,C); %更新im的CData属性
# v8 @& D8 j# f1 T- |) d& H set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度* Q2 j; u' O/ n/ v3 Z' _3 y+ ?! I
set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本, g$ ?6 }2 z B, V v0 \# l
2 g6 _- ~; V% o9 \: S4 n
frame=getframe(gcf);
1 m6 l( z% t* k# |( @ writeVideo(WriteObject,frame);
4 @6 K L2 G; @ end
! A5 W. T$ T; y. K- Y eval([clear ,str1]);
% d6 T# `4 W2 V* P0 c! H end
8 _, z/ Q1 |( {6 e0 v* M
4 j M# j. e' w4 K 效果图:' H( E: E$ x0 B3 _% p6 L. j
8 n+ i3 Z' O& `- H2 C+ y# j# c9 _ 数据来源网站:
( b9 t; z6 p0 {: ?* [2 B& o$ [
" `5 C9 m4 {% h5 J9 V' K( z0 @! b (引用声明: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/)
' w3 ?+ n% P: U* O# Y 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件:
7 Z! y& O# d# N N# G ; O* Q+ S& \2 ]
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚) 1 l1 ?/ W$ g7 h
参考文献: 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% p6 h4 x6 N2 n4 z* Z% h
2 Y3 W2 N# h K+ V, X; B' I. ` _9 b
+ v6 L1 g. A0 _1 ~( L m. h
; J* ^. G$ P6 k9 g, E. A |