|
, t7 E. D5 P; e; U& r2 N) t5 F1 a 最近准备参加美赛,队伍拿了2020年美赛A题磨合。得到数据后我便在想着怎么把图做得好看点,不得不说matlab作为商业软件这方面确实好用,使用imagesc()函数便可以非常好地实现我的目的。 " F6 @3 n) a# k
matlab程序代码:
+ F: S+ C- L- k' q0 ]- O% E4 J %对图窗属性进行初始化
7 p8 I# P0 B3 [8 z9 u3 ^0 l! w2 W figure1 = figure(1); %创建图窗并获取图窗句柄6 Q$ u" n7 |0 p: ~3 W! E' o. I
SIZE=get(0); %获取显示屏信息9 \8 b0 a, }; q4 n7 V
set(figure1,outerposition,SIZE.ScreenSize); %设置图窗位置和外部尺寸为显示屏大小3 U4 @$ T7 K( m% b
C=zeros(180,360); %预分配内存
0 L" W* `: f0 K, G, ` SY=zeros(22,1); %用于存储每一份数据的起始年份
5 `' R3 q$ u1 b( ?5 @ A; q STR1=cell(22,1); %用于存储变量名% E9 |' ]" K/ q6 J
STR2=STR1; %%用于存储文件名2 U" I3 ~# f$ w8 @
clim=[-1000,3500]; %设定imagesc的数值范围
- M8 F, Q. t( R& X# G* y r# Z im=imagesc(C,clim); %创建image初始对象! G" w7 p% I% b% `( @
colormap(jet); %指定颜色映射类型为jet
9 {) c' z7 `& X- {' x& } txt=text(320,175,0,," FontSize" ,20); %初始化一个text对象,用于显示年份和月份
4 {$ ^' ^( J; I. f3 s& |) b title(Sea Surface Temperature (From 1870.1 to 2020.11),Interpreter,latex,FontSize,20);" O/ z7 j. I' ?
axis off
9 F2 H* c I/ N+ H hold on3 I' O/ h0 s6 P5 V( i3 o
cbar(); %显示预先设定的colorbar
4 Z7 ]1 O) T1 ?& ^& w %%
, E) y6 N' k/ k$ Z0 [; @ filename = SST.mp4; T9 p: s+ i' o; R8 [
fps=10;
5 [7 Z5 V. n+ x. V0 I WriteObject=VideoWriter(filename,MPEG-4); %创建视频写入对象 I* B" u! m; K+ t: ^
WriteObject.FrameRate=fps;
/ b" _( J; \4 e- a$ p WriteObject.Quality=100;
+ A! w+ Y- x1 j/ |' ?0 K open(WriteObject);+ h, H* g$ g- P- }
%%$ O$ T/ L: B# ^/ s# T, b4 |. Z
SY(1:5,1)=[1870 1901 1931 1961 1991];) J. ~( J( w$ [5 K' N7 Z# c: v
STR1(1:5,1)={HadISST1SST18701900,HadISST1SST19011930,HadISST1SST19311960,HadISST1SST19611990,HadISST1SST19912003};% G# L$ l# I1 r3 ^/ H8 `
STR2(1:5,1)={SST1870_1900,SST1901_1930,SST1931_1960,SST1961_1990,SST1991_2003};* Q3 T: h9 W) ]
for m=4:19% ]0 ^# G2 s" u3 v9 r6 {: V
sy=2000+m;
' W4 x1 B7 A+ C H str1=[HadISST1SST20,num2str(m,%02d)];
& J! L+ a. W& m8 M: o" R3 C q str2=[SST20,num2str(m,%02d)];' T& L! w: P- @% O5 c. l' c
SY(m+2,1)=sy;+ D; V# b9 V1 z4 o# y+ M n
STR1(m+2,1)={str1};/ O3 ]; r+ a1 \( f& }
STR2(m+2,1)={str2};
& r/ n& y: v5 Z; _7 v1 M4 [ end6 m$ }5 z ]5 H7 v
SY(end)=2020;
. C( S( M8 [. W STR1(end)={HadISST1SST1};
, D0 D, n; D% \" s$ } STR2(end)={SST2020};( ]9 i' L8 i7 @$ A' O( ?9 k
; B$ h7 y# t g: } [rowsize,~]=size(SY);
1 t2 m* O' g& |2 x+ T: p for i=1:rowsize6 e6 y0 g) S8 ^% X
shsst(STR1{i},STR2{i},C,SY(i),WriteObject,im,txt)
- k0 T9 D8 ^& z! E) g end
2 v* W0 z* D( f: B3 K. K7 k: d$ W9 R0 ^' q# A, P
hold off
; j& H; h& p0 b3 Q* p close(WriteObject)1 q z1 s7 K- @* d
%%
! v$ b7 _; Z% t' J- U! Q: i e functioncbar()Tem=(-10:5:35);! }1 w: o7 x7 W( c+ n9 A
labcell=cell(1,10); %用于存储colorbar标签
) X' ?2 z% k: j F& H/ `/ ^ for i=1:10
' T2 {' k7 ^# N0 _; x$ m6 P labcell(i)={[${,int2str(Tem(i)),\,}^oC$]};
' _9 P U/ T1 V* }. E4 K end: c r1 s4 o3 A5 x6 P9 ^4 [7 o% B5 Q
cb=colorbar;
- a8 Z& z Y9 \ cb.TickLabelInterpreter=latex; %设置colorbar的刻度标签解释器为latex
& j% [# q$ V, k( y: @$ ]! r cb.TickLabels=labcell;. I* D* V8 d+ T7 _7 g! C( D- B3 ^
cb.FontSize=12;
1 o- u, ^+ K( n end
2 h2 M3 c+ D) Z I: [2 |4 Q
2 y9 L: ]7 p& N- e- A( H functionshsst(str1,str2,C,sy,WriteObject,im,txt )load([str2,.mat],str1);
2 B$ g3 J! r( w' ]* v% ^ eval([[n1,~]=size(,str1,);]); %利用eval()函数执行文本代表的语句
* @1 \( h( L X5 ?9 A n1=n1/181-1; %数据每181行是一个月的全球SST数据8 t$ |! S, I t: h
for i=0:n1
% l& h1 f$ Q8 e9 [4 \ eval([C(:, =,str1,(2+181*i:181+181*i,1:360);]);9 J* s1 G @% n5 N" \
C(C==-32768)=NaN;) |9 N* j7 N+ O5 l) |( ?9 e Y& r
set(im,CData,C); %更新im的CData属性: }1 p1 h* N8 D
set(im,alphadata,1-isnan(C).*0.9); %利用isnan()函数标出NaN的位置并修改相应位置图形的透明度
7 G% R5 n; z! i1 y# I set(txt,String,[int2str(sy+floor(i/12)),-,int2str(mod(i,12)+1)]); %更新文本2 I. B- s# l/ _: b% |
5 ?! X2 y0 F5 w4 T- w2 u frame=getframe(gcf);
% k# {& s6 a/ g, V( u Q/ k) b writeVideo(WriteObject,frame);
0 x: U' l# }' ~6 y5 z end& } t3 s- W8 m7 x5 a
eval([clear ,str1]);3 Z8 X% t) r, e$ j/ X1 \
end" Z; J( ~% O# G$ b
2 K9 v1 z' n' M1 Y 效果图:
+ A* M& }% @! i' z1 t C0 w 2 z. O9 Q5 G( P8 b4 v0 V
数据来源网站:
2 v! C$ `2 ]" l' ^
2 s% V+ o, r& K1 i4 V/ D (引用声明: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/)
% N/ Z+ w* w3 U2 r9 |- F, ` 代码中使用的文件数据都是我已经处理好的,如果自己导入数据的话记得修改代码对应位置的文件名和变量名。这是我导出完成的mat文件: ' r1 g& v; z! T, k% O( G9 Y
6 u- l; u! A: S [/ v
提取码8xt8。 2021.2.2更新有小伙伴私信问我那么一大堆数据具体是代表了个啥,在这里解释一下:原始数据是每181行储存了一个月的全球海洋表面温度数据,其中第一行是年月等信息,后面180行是180*360的矩阵,是将世界地图分成了180*360个小块,每一个数值大小代表了所在小块的温度,其中-32768代表陆地。(P.S.我看地图最北边越过陆地那块很多数值只是-1000或者-180,这是为啥我也不太清楚)
5 B. h" H: F# `& B' C. z. l$ s& k8 Z. S 参考文献: 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
! _: ?, a+ Z6 O% P9 h3 Z {9 }
0 u/ c7 a! i' {* F d' e! ~
& M( b R/ E0 T8 }1 H/ n' O9 y" c
. e: P& r* b8 Z% l- Z
, x/ J5 N# j! T! J5 K& r1 B |