matlab绘制海流流速、流向玫瑰图表

本文介绍了如何使用Matlab处理海流数据,通过生成随机流速和流向,绘制玫瑰图展示分布情况,并计算各流向的概率、最大值和平均值,最后将结果整理成Excel表格。
摘要由CSDN通过智能技术生成

最近处理海流数据,接触到玫瑰图表的绘制,从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;

下面是表结果

在这里

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Matlab 绘制海流图,可以按照以下步骤进行: 1. 导入或生成海流数据:可以通过海洋观测数据、数值模拟结果或其他来源获得海流数据。将数据存储在适当的格式中,如网格数据或经纬度坐标数据。 2. 在 Matlab 中创建网格或坐标系统:根据海流数据的空间范围和分辨率,在 Matlab 中创建相应的网格或坐标系统。可以使用 `meshgrid` 函数创建二维网格,或使用 `linspace` 函数生成经纬度坐标。 3. 绘制海流箭头:使用 `quiver` 函数绘制海流箭头。该函数可以接受三个输入参数:x 坐标、y 坐标和箭头的 u、v 分量。可以根据海流数据中的速度值来设置箭头的长度和方向。 4. 设置海流箭头样式:可以通过设置 `quiver` 函数的参数来调整箭头的样式,如箭头长度、线宽、颜色等。可以使用 Matlab 中的颜色映射函数来将箭头颜色与海流速度相关联。 5. 添加地理信息:可以使用 `geoshow` 函数将地理信息添加到海流图中,如海岸线、陆地边界等。这样可以更清楚地显示海流数据和位置。 6. 添加标题和标签:根据需要,可以使用 `title`、`xlabel` 和 `ylabel` 函数添加标题和坐标轴标签,以提供更详细的图像说明。 7. 保存和显示图像:最后,可以使用 `savefig` 函数将海流图保存为文件,如 PNG 或 JPEG 格式。也可以使用 `figure` 和 `imshow` 函数将海流图显示在 Matlab 图形窗口中。 通过以上步骤,就可以使用 Matlab 绘制海流图,以直观地展示海流的速度和方向分布。绘制海流图可以用于海洋科学研究、航海导航等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值