在之前,有个博客专门讲matlab 绘制风速、风向统计玫瑰花图;这里面存在不少细节问题,目前对该部分代码做了优化。以前的博客链接见下:
Matlab 绘制风速、风向统计玫瑰花图
最近接了一个任务,需要绘制风速、风向的统计玫瑰花图。
图中的风向表示风的来向。
在这里用到一些工具包,如tight_subplot,wind_rose,WindRose。颜色的colorbar:sunshine_9lev。
在这张图中用到的是WindRose工具包。
首先优化的是风速的分段,以前分的太粗糙了,修正后则会美观很多。
见下:
修正前:
修正后:
代码示例:
% 清除工作空间并添加路径
clear
path(path,'.\wind_rose');
path(path,'.\WindRose');
path(path,'E:\new_matlab_Tool\tight_subplot');
path(path,'E:\new_matlab_Tool\export_fig3.25\export_fig-master');
% 设置图形大小并创建图形对象
fig_size = 800;
figure('color','w','position',[50, 50, fig_size*1.414,fig_size]);
% 使用 tight_subplot 函数创建 2x2 的子图对象,并返回子图对象数组 ax 和位置信息 pos
[ha, pos] = tight_subplot(2,2,[.035 .035],[.05 .05],[.05 .1]);
% 绘制第一个子图
ii = 1;
ax(ii) = subplot(2,2,1,'Position',pos{ii,1});
plot_data(ii)
% 绘制第二个子图
ii = 2;
ax(ii) = subplot(2,2,2,'Position',pos{ii,1});
plot_data(ii)
% 绘制第三个子图
ii = 3;
ax(ii) = subplot(2,2,3,'Position',pos{ii,1});
plot_data(ii)
% 绘制第四个子图
ii = 4;
ax(ii) = subplot(2,2,4,'Position',pos{ii,1});
plot_data(ii)
% 保存图形为 PNG 格式文件
export_fig( gcf, '-png', '-r600', ['wind_rose','.png']);
% 定义绘制数据的函数 plot_data
function plot_data(ii)
% 加载颜色条数据
sunshine_9lev = load('E:\new_matlab_Tool\colorbar_NCL\colorbar\sunshine_9lev.txt');
% 定义经纬度范围
minlon = 113; maxlon = 129; minlat = 4; maxlat = 14;
lon = [minlon:0.25:maxlon];
lat = [minlat:0.25:maxlat];
[lon lat] = meshgrid(lon,lat);
[mm nn] = size(lon);
% 加载风速数据
load('../u10/u_season_mean.mat');
load('../v10/v_season_mean.mat');
if ii ==1
uu = u10_map2_s1_mean;
vv = v10_map2_s1_mean;
elseif ii == 2
uu = u10_map2_s2_mean;
vv = v10_map2_s2_mean;
elseif ii == 3
uu = u10_map2_s3_mean;
vv = v10_map2_s3_mean;
else
uu = u10_map2_s4_mean;
vv = v10_map2_s4_mean;
end
% 计算风速和风向
N=1; xx=lon(:,:,N); yy=lat(:,:,N);
[mm nn jj] = size(uu);
V2=sqrt(uu.^2+vv.^2);%计算速度
V2 = reshape(V2,[mm*nn*jj 1]);
uu = reshape(uu,[mm*nn*jj 1]);
vv = reshape(vv,[mm*nn*jj 1]);
for kk = 1:mm*nn*jj
DD(kk,1) = fun_wind(uu(kk,1),vv(kk,1));
end
% 设置风玫瑰图参数
Options = {'anglenorth',0,...
'angleeast',90,...
'labels',{'N (0^o)','NE (45^o)','E (90^o)','SE (135^o)','S (180^o)','SW (225^o)','W (270^o)','NW (315^o)'},...
'freqlabelangle',-22.5,...
'MaxFrequency',40,... % 最大频率
'nFreq',5,...
'vWinds',[0:1:10],...
'LabLegend','Wind Speed (m/s)',...
'legendtype',0,...
'scalefactor',0.8,...
'titlestring',' ',...
'cMap',sunshine_9lev
};
% 调用 WindRose 函数绘制风玫瑰图
WindRose(DD,V2,[Options,{'axes',gca}]);
% 添加子图标题和颜色条
if ii ==1
title('Spring','FontName','Times New Roman','FontWeight','bold','Fontsize',16,'color','m');
elseif ii == 2
title('Summer','FontName','Times New Roman','FontWeight','bold','Fontsize',16,'color','m');
elseif ii == 3
title('Autumn','FontName','Times New Roman','FontWeight','bold','Fontsize',16,'color','m');
else
title('Winter','FontName','Times New Roman','FontWeight','bold','Fontsize',16,'color','m');
end
colormap(sunshine_9lev);
caxis([0 10])
if ii == 4
cl = colorbar('location','east','position',[0.9 0.06 0.01 0.88]);
ylabel(cl,'Wind speed [m/s]','FontName','Times New Roman','FontWeight','bold','Fontsize',14);
end
end
% 定义计算风向的函数 fun_wind
function fx = fun_wind(u,v) % 外面吹向地区中心的方向[风的来向]
ct=atand(v/u);
if u>0&&v>0
fx=270-ct;
elseif u<0&&v>0
fx=90-ct;
elseif u<0&&v<0
fx=90-ct;
elseif u>0&&v<0
fx=270-ct;
elseif u==0&&v>0
fx=180;
elseif u==0&&v<0
fx=0;
elseif u>0&&v==0
fx=270;
elseif u<0&&v==0
fx=90;
end
end
代码解释:
这段代码是用 MATLAB 编写的,用于生成一个包含四个风玫瑰图的图形,并保存为 PNG 格式文件。以下是代码的主要功能:
1、清除工作空间并添加路径。这些语句用于清除工作空间中的变量,并将包含需要使用的函数和工具的路径添加到 MATLAB 的搜索路径中。
clear
path(path,'.\wind_rose');
path(path,'.\WindRose');
path(path,'E:\new_matlab_Tool\tight_subplot');
path(path,'E:\new_matlab_Tool\export_fig3.25\export_fig-master');
2、设置图形大小并创建图形对象。这些语句用于创建一个图形对象,并设置其大小和背景颜色。
fig_size = 800;
figure('color','w','position',[50, 50, fig_size*1.414,fig_size]);
3、使用 tight_subplot 函数创建 2x2 的子图对象。这些语句使用 tight_subplot 函数创建一个 2x2 的子图对象数组 ax,并返回每个子图在图形中的位置信息 pos。
[ha, pos] = tight_subplot(2,2,[.035 .035],[.05 .05],[.05 .1]);
4、绘制四个子图。这些语句用于在每个子图位置上绘制风玫瑰图,其中 plot_data 函数用于绘制每个子图上的数据。
ii = 1;
ax(ii) = subplot(2,2,1,'Position',pos{ii,1});
plot_data(ii)
ii = 2;
ax(ii) = subplot(2,2,2,'Position',pos{ii,1});
plot_data(ii)
ii = 3;
ax(ii) = subplot(2,2,3,'Position',pos{ii,1});
plot_data(ii)
ii = 4;
ax(ii) = subplot(2,2,4,'Position',pos{ii,1});
plot_data(ii)
5、保存图形为 PNG 格式文件。这条语句用于将图形保存为 PNG 格式文件。
export_fig( gcf, '-png', '-r600', ['wind_rose','.png']);
6、定义绘制数据的函数 plot_data。这个函数用于绘制每个子图上的数据,包括加载数据、计算风速和风向、设置风玫瑰图参数、调用 WindRose 函数绘制风玫瑰图、添加子图标题和颜色条等操作。
function plot_data(ii)
...
end
7、定义计算风向的函数 fun_wind。这个函数用于根据风速分量 u 和 v 计算风向。
function fx = fun_wind(u,v)
...
end
**备注:**定义风速风向的函数可以继续优化;可以选用matlab内置函数
Dir=mod(atan2d(uu1,vv1),360);
根据uv求流向,正北为0°