最近处理海流数据,接触到玫瑰图表的绘制,从gpt、网上查阅到完成分析。在这里分享代码与大家交流,也给自己加深印象。
一、海流玫瑰图绘制
假设分别随机生成3000个流速大小在65cm/s以下的水平流速和垂向流速用作示例。
1、计算海流流速、流向
clc;clear;close all;
uu=randi([-50, 50], 3000, 1);
vv=randi([-50, 50], 3000, 1);
V_spd=sqrt(uu.^2+vv.^2);
%注意:角度表示要与下面玫瑰图中参数相一致,对应Options中的'anglenorth','angleeast'.
V_angle=mod(-angle(uu+vv.*i).*180./pi+90+360,360);%0(N),90(E),180(S),270(W)
2、流速流向玫瑰图绘制
%figure
addpath(genpath('windrose'));%从网上找的包稍作改动
Options = {'anglenorth',0,...
'angleeast',90,...
'labels',{'N (0°)',[],'45°',[],'E (90°)',[],'135°',[],'S (180°)',[],'225°',[],'W (270°)',[],'315°',[]},...
'freqlabelangle',67.5,...
'nspeeds',7,...
'SpeedRound',60,...
'ndirections',16,...
'lablegend','Speeds in cm/s',...
'legendtype',2,...
'legendvariable','W_s',...
'min_radius',0.1,...
'titlestring','All time uvRose',...
'height',12*50,...
'width',15*50,...
'cmap','jet',...
'titlefontname','Times New Roman','titlefontsize',14,'titlefontweight','bold',...
'frequencyfontname','Times New Roman','frequencyfontsize',10};
WindRose(V_angle,V_spd,Options);
saveas(gcf,['D:\All_time_fig\test.png']);
savefig(['D:\test.fig']);
下面是图形结果:
二、海流各流向分布概率、最大值、平均值统计表
1、计算并统计海流流向、最大值、平均值
clc;clear;close all;
uu=randi([-50, 50], 3000, 1);
vv=randi([-50, 50], 3000, 1);
[V_speed,V_angle]=uv2spddir(uu,vv);
edges_speed = [0:10:60,1000]; % 速度的分组边界(假设每个分组宽度为10cm/s)
edges_angle = 11.25:22.5:348.75; % 角度的分组边界NNE-NE-...-NNW,
non_missing_indices = ~isnan(V_speed);
% 计算联合概率、最大值和平均值
joint_probability = zeros(length(edges_speed)-1, length(edges_angle)-1);
for i = 1:length(edges_speed)-1
for j = 1:length(edges_angle)-1
indices = find((V_speed >= edges_speed(i) & V_speed < edges_speed(i+1)) & ...
(V_angle >= edges_angle(j) & V_angle < edges_angle(j+1)));
joint_probability(i, j) = length(indices) / sum(non_missing_indices);
if length(indices)==0
Max_speed1(i,j)=0;
Mean_speed1(i,j)=0;
else
Max_speed1(i,j)=max(max(V_speed(indices)));
Mean_speed1(i,j)=mean(mean(V_speed(indices)));
end
indices_N1=find((V_speed >= edges_speed(i) & V_speed < edges_speed(i+1)) & ...
(V_angle >= edges_angle(end)) );
indices_N2=find((V_speed >= edges_speed(i) & V_speed < edges_speed(i+1)) & ...
(V_angle < edges_angle(1)) );
indices_N=[indices_N2;indices_N1];
joint_probability_N(i)=(length(indices_N2)+length(indices_N1))/sum(non_missing_indices);
if length(indices_N)==0
Max_speed1_N(i)=0;
Mean_speed_N(i)=0;
else
Max_speed1_N(i)=max(max(V_speed(indices_N)));
Mean_speed1_N(i)=mean(mean(V_speed(indices_N)));
end
end
end
%最大值统计
Max_speed2=max(Max_speed1,[],1);
Max_speed3=[max(Max_speed1_N),Max_speed2];
Max_speed0=[Max_speed3,max(Max_speed3)];
%平均值统计
Mean_speed2=mean(Mean_speed1,1);
Mean_speed3=[mean(Mean_speed1_N),Mean_speed2];
Mean_speed0=[Mean_speed3,mean(Mean_speed3)];
%分布概率、最大值、平均值、合计,矩阵整合
joint_probability1=[joint_probability_N',joint_probability];
joint_probability2=[joint_probability1,sum(joint_probability1,2)].*100;%概率用百分数表示
joint_probability3=[joint_probability2;[sum(joint_probability2(:,1:end),1)]];
joint_probability0=[joint_probability3;Max_speed0;Mean_speed0];
joint_probability=round(joint_probability0,1);%结果保留一位小数
2、写入excel表
A=joint_probability;
%将矩阵写入表格
% 创建行标题和列标题
row_titles = string({'0-10','10-20','20-30','30-40','40-50','50-60','>60'...
,'合计(%)','最大(cm/s)','平均(cm/s)'}); % 创建行标题
col_titles = string({'N','NNE','NE','ENE','E','ESE','SE','SSE','S',...
'SSW','SW','WSW','W','WNW','NW','NNW'}); % 创建列标题
% 写入 Excel 文件
filename = 'D:\Notebook_tang\UV_dir_Rose\test.xlsx'; % Excel 文件名
writematrix(A, filename, 'Sheet', 'Sheet1', 'Range', 'B3:R12'); % 写入数组数据
writematrix(row_titles', filename, 'Sheet', 'Sheet1', 'Range', 'A3:A12'); % 写入行标题
writematrix('合计(%)', filename, 'Sheet', 'Sheet1', 'Range', 'R1'); % 写入行标题
writematrix('流速(cm/s)', filename, 'Sheet', 'Sheet1', 'Range', 'A1'); % 写入行标题
writematrix('流向', filename, 'Sheet', 'Sheet1', 'Range', 'B1'); % 写入上半部分列标题
writematrix(col_titles, filename, 'Sheet', 'Sheet1', 'Range', 'B2:Q2'); % 写入下半部分列标题
% 合并栏
excel = actxserver('Excel.Application');
workbook = excel.Workbooks.Open(fullfile( filename));
worksheet = workbook.Sheets.Item(1);
range1 = worksheet.Range('B1:Q1');
range1.MergeCells = true;
range2 = worksheet.Range('A1:A2');
range2.MergeCells = true;
range3 = worksheet.Range('R1:R2');
range3.MergeCells = true;
% 选中所有单元格
usedRange = worksheet.UsedRange;
usedRange.Select;
% 设置水平居中和垂直居中
usedRange.HorizontalAlignment = -4108; % 水平居中对齐常数
usedRange.VerticalAlignment = -4108; % 垂直居中对齐常数
workbook.Save;
excel.Quit;
下面是表结果