MATLAB|风玫瑰图

目录

扫一扫关注公众号

效果图

粉丝给的图:

复刻的图:

其他样式效果:

数据

绘图教程

绘制左边Y轴

绘制主、次网格和主、次刻度的极坐标区域。

添加刮风数据,添加数据和颜色、图列大小映射关系。

颜色条绘制​​​​​​​

添加图列绘制​​​​​​​

绘图工具箱介绍

默认绘图​​​​​​​

刻度颜色设置​​​​​​​

刻度方向和长短设置,其中刻度方向有:'in'|'out'|'both'‍。​​​​​​​

网格设置:主、次网格的颜色、粗细、透明度设置。

背景颜色设置​​​​​​​

图列设置​​​​​​​

颜色条设置

WindRosePlot类函数

属性:

方法:


扫一扫关注公众号

效果图

粉丝给的图:

图片

复刻的图:

图片

其他样式效果:

图片

数据

数据包含:风向、刮风频率、最大风速、平均风速四个数据。

windDirections = [0.0, 22.5, 45.0, 67.5, 90.0, 112.5, 135.0, 157.5, 180.0, 202.5, 225.0, 247.5, 270.0, 292.5, 315.0, 337.5]';
windFrequency = [10.2, 4, 4, 3.0, 4.0, 3.0, 4.0, 4.0, 7.0, 6.0, 3, 2, 2, 1.0, 3, 5]';
maxWindSpeed = [15, 12, 10, 5, 5, 5,10, 12, 13, 15, 12,5, 5, 10, 12,  15]';
avgWindSpeed = [2.8, 2.0, 1.5, 1.2, 1.4, 1.3, 1.45, 2.00, 2.80, 2.80, 1.50, 1.00, 1.0, 1.0, 1.8, 2.0]';
data=[windDirections,windFrequency,maxWindSpeed,avgWindSpeed];

数据长成这样的

图片

绘图教程

绘制左边Y轴

% 设置基础参数
maxRadius = ceil(max(windFrequency));
minRadius = round(maxRadius / 10);
dfT=unique(diff(windDirections));
allTheta = 0:0.01:360;
% 创建并配置坐标轴
fig=figure('Color',[1,1,1]);
ax = gca;
hold on; box off; grid off; axis equal;
ax.YLim = [-maxRadius, maxRadius];
ax.YMinorTick = 'on';
ax.XColor = 'none';
ax.XDir = 'normal';
ax.TickDir = 'out';
ax.LineWidth = 1.5;
majorTicksY = ax.YTick;
minorTicksY = (majorTicksY(1:end-1) + majorTicksY(2:end)) / 2;
diffTicks = unique(diff(majorTicksY));
maxRadius=max(ax.YTick)+diffTicks/2;
ax.YLim = [-maxRadius, maxRadius];%重新设定
ax.YAxis.MinorTickValues = [minorTicksY(1)-diffTicks, minorTicksY, minorTicksY(end)+diffTicks];
ax.YTickLabel = arrayfun(@(y) sprintf('%d', abs(y)), majorTicksY, 'UniformOutput', false);
ax.YLabel.String='风向频率(%)';

图片

绘制主、次网格和主、次刻度的极坐标区域。​​​​​​​

% 绘制主要的极坐标网格线
majorRadius = majorTicksY(majorTicksY > minRadius);
for i = 1:length(majorRadius)[xMajor, yMajor] = pol2cart(deg2rad(allTheta), majorRadius(i));plot(xMajor, yMajor, '-', 'Color', [0 0 0], 'LineWidth', 0.5);
end
majorTheta = windDirections;
fullRadius = linspace(minRadius, maxRadius, 1000);
for i = 1:length(majorTheta)[xMajorT, yMajorT] = pol2cart(deg2rad(majorTheta(i)), fullRadius);plot(xMajorT, yMajorT, '-', 'Color', [0.8 0.8 0.8], 'LineWidth', 1.2);
end
% 绘制次要的极坐标网格线
minorRadius = minorTicksY(minorTicksY > minRadius);
for i = 1:length(minorRadius)[xMinor, yMinor] = pol2cart(deg2rad(allTheta), minorRadius(i));plot(xMinor, yMinor, ':', 'Color', [0.55 0.55 0.55], 'LineWidth', 0.8);
end
minorTheta=windDirections+dfT/2;
% minorTheta = 11.25:22.5:360;
for i = 1:length(minorTheta)[xMinorT, yMinorT] = pol2cart(deg2rad(minorTheta(i)), fullRadius);plot(xMinorT, yMinorT, '-.', 'Color', [0.55 0.55 0.55]);
end
% 绘制最外层的极坐标线
[xOuter, yOuter] = pol2cart(deg2rad(allTheta), maxRadius);
plot(xOuter, yOuter, '-', 'Color', 'k', 'LineWidth', 2);
% 主刻度线
mainTickTheta= windDirections+dfT;
% mainTickTheta = 0:22.5:360;
tickRadius = [maxRadius*0.96, maxRadius];
for i = 1:length(mainTickTheta)[xMainTick, yMainTick] = pol2cart(deg2rad(mainTickTheta(i)), tickRadius);plot(xMainTick, yMainTick, '-', 'Color', [0, 0, 0], 'LineWidth', 1.5);
end
% 次刻度线
minorTickTheta=windDirections+dfT/2;
% minorTickTheta = 11.25:22.5:360;
tickRadiusMinor = [maxRadius*0.98, maxRadius];
for i = 1:length(minorTickTheta)[xMinorTick, yMinorTick] = pol2cart(deg2rad(minorTickTheta(i)), tickRadiusMinor);plot(xMinorTick, yMinorTick, '-', 'Color', [0 0 0], 'LineWidth', 1.5);
end
% 添加主刻度外的标签
labelDist = maxRadius *(1+ 0.094); % 设定标签距离为最大半径(1+ 0.094),可以根据需要进行调整
for i = 1:length(majorTheta)adjustedAngle = majorTheta(i); % 从正北方开始,并且顺时针增加 % 从正北方开始,并且顺时针增加angle = mod(adjustedAngle, 360); % 确保角度在0-360之间[xLabel, yLabel] = pol2cart(deg2rad(90-adjustedAngle), labelDist);labelText = sprintf('%.1f°', angle);text(xLabel, yLabel, labelText, 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle');
end

图片

添加刮风数据,添加数据和颜色、图列大小映射关系。​​​​​​​

adjustedWindDirections = 360 - windDirections;
[xWind, yWind] = pol2cart(deg2rad(adjustedWindDirections + 90), windFrequency);
colorGradient = [0.0078, 0.0941, 0.7333; 0.9725, 0.0039, 0.5216];
colorMapMajor = makeColorMap(colorGradient, length(windDirections));
% 根据风速大小对颜色进行排序
[~, idx] = sort(maxWindSpeed, 'Ascend');
sortedColorMap = colorMapMajor(idx, :);
% 对于相同的风速值,使用第一个出现的颜色值为其赋色
uniqueSpeeds = unique(maxWindSpeed, 'stable');
for i = 1:length(uniqueSpeeds)currentSpeed = uniqueSpeeds(i);indices = find(maxWindSpeed == currentSpeed);if length(indices) > 1sortedColorMap(indices, :) = repmat(sortedColorMap(indices(1), :), length(indices), 1);end
end
maxWind = max(maxWindSpeed);
desiredMaxSize=max(avgWindSpeed);
desiredMinSize=min(avgWindSpeed);
for i = 1:length(windDirections)color = getColorForSpeed(maxWindSpeed(i), maxWind , colorMapMajor);s = mapToMarkerSize(avgWindSpeed(i), desiredMaxSize, desiredMinSize);plot(xWind(i), yWind(i), 'o', 'LineWidth', 1.2, 'MarkerSize',s, ...'MarkerEdgeColor', 'k', 'MarkerFaceColor', color);
end

图片

颜色条绘制​​​​​​​

colorMapMinor = makeColorMap(colorGradient, 10);
colormap(colorMapMinor);
cBar = colorbar;
cBar.Position = [.9 .1 .04 .36];
cBar.LineWidth = 1.2;
cBar.TickLength = 0.025;
cBar.Ticks = linspace(floor(min(maxWindSpeed)),ceil(max(maxWindSpeed)),11);
% cBar.Ticks =linspace(minWindSpeed, maxWindSpeed, 11);
tickLabels = arrayfun(@(x) sprintf('%.1f', x), cBar.Ticks, 'UniformOutput', false);
cBar.TickLabels = tickLabels;
cBar.TickDirection = 'both';
colorBarTitle = title(cBar, '最大风速(m/s)');
caxis([floor(min(maxWindSpeed)),ceil(max(maxWindSpeed))]);
AxSize=axes(fig,'Position',[.86 0.55 .1 .36],'Color',[1,1,1]);
title(AxSize,'平均风速(m/s)')
AxSize.XColor='none';
AxSize.YColor='none';
meanRLabel=linspace(ceil(0.3),ceil(2.6),5);

图片

添加图列绘制​​​​​​​

% 定义半径和距离
legR=linspace(ceil(min(avgWindSpeed)),ceil(max(avgWindSpeed)),5);
d =ceil(ceil(max(avgWindSpeed))/2);
% 计算每个圆的中心位置
legY = zeros(1, length(legR));
totalHeight = sum(2.*legR) + d*(length(legR)-1);
legY(1) = totalHeight/2 - legR(1);
for i = 2:length(legR)legY(i) = legY(i-1) - 2*legR(i-1) - d;
end
% 绘制圆形
hold on;
for i = 1:length(legR)rectangle('Position',[-legR(i), legY(i)-legR(i), 2*legR(i), 2*legR(i)], 'Curvature', [1, 1],'LineWidth',1);text(max(legR) + 0.6, legY(i), sprintf('%.1f', legR(i)));
end
axis equal;
xlim([-max(legR) max(legR)]);
ylim([legY(end)-legR(end) legY(1)+legR(1)]);
hold off;

图片

绘图工具箱介绍

默认绘图​​​​​​​

figure('name','默认绘图')
w=WindRosePlot(data);
w.plot();

图片

刻度颜色设置​​​​​​​

figure('name','设置刻度颜色')
w=WindRosePlot(data);
w.AxisColor=[0,0,1];
w.AxisLineWidth=2;
w.plot();

图片

刻度方向和长短设置,其中刻度方向有:'in'|'out'|'both'‍。​​​​​​​

figure('name','设置刻度方向、长短')
w=WindRosePlot(data);
w.AxisMainTickDir='both';
w.AxisMinorTickDir='out';
w.AxisColor=[1,0,0];
w.AxisLineWidth=2;
w.AxisTickLength=0.08;
w.plot();

图片

网格设置:主、次网格的颜色、粗细、透明度设置。

figure('name','主、次网格样式、颜色、粗细、透明度')
w=WindRosePlot(data);
w.RGrid='on';
w.RGridLineStyle='-.';
w.RGridColor=[1,0,0];
w.RGridAlpha=0.5;
w.RGridLineWidth=1.5;w.ThetaGrid='on';
w.ThetaGridLineStyle='--';
w.ThetaGridColor=[0,1,0];
w.ThetaGridAlpha=0.5;
w.ThetaGridLineWidth=2;w.MinorRGrid='on';
w.MinorRGridLineStyle='-';
w.MinorRGridColor=[1,1,0];w.MinorThetaGrid='on';
w.MinorThetaGridLineStyle=':';
w.MinorThetaGridColor=[0,0,1];
w.plot();

图片

背景颜色设置​​​​​​​

figure('name','背景颜色')
w=WindRosePlot(data);
w.ColorMaps=hsv;
w.AxisBackgroundColor=[1,1,1]*0.10;
w.AxisFaceAlpha=0.1;
w.plot();

图片

图列设置​​​​​​​

figure('name','图列设置:title设置、背景色、边缘色、边缘粗细、字体属性')
w=WindRosePlot(data);
w.LegendTitle='图列设置Title';
w.LegendBackgroundColor=[1,.9,.8]*.98;
w.LegendEdgeColor='m';
w.LegendLineWidth=4;
w.LegendFontName='Times new Roman';
w.LegendFontSize=16;
w.LegendFontAngle='normal';
w.LegendFontWeight='bold';%加粗
w.plot();

图片

颜色条设置

figure('name','颜色条设置')
w=WindRosePlot(data);
% load('colorsData/acton100.mat')
% load('colorsData/bwr.mat')
% load('colorsData/vikO100.mat')
% w.ColorMaps=colorsList;
% w.ColorMaps=hsv;
% w.ColorMaps=bone;
% w.ColorMaps=jet;
% w.ColorMaps=winter;
w.ColorMaps=spring;
w.ColorMapsTitle='颜色条 Title测试';
w.ColorMapsFontSize=14;
w.ColorMapsFontAngle='italic';
w.plot();
 

图片

图片

图片

图片

图片

图片

WindRosePlot类函数

收藏=学会

classdef WindRosePlot% ------------------------------------------------%  @Author:  好玩的 MATLAB.%  @E-mail:  2377389590@qq.com%  @WeChat:  idmatlab%  @Date:    Oct 30, 2023.%  @Version: Matlab R2022b.%  % #Respect the fruits of labor. Please note the tweet link and official account name when reprinting. Commercial use is strictly prohibited.%  Example:%     windDirections = [0.0, 22.5, 45.0, 67.5, 90.0, 112.5, 135.0, 157.5, 180.0, 202.5, 225.0, 247.5, 270.0, 292.5, 315.0, 337.5]';%     windFrequency = [10.2, 4, 4, 3.0, 4.0, 3.0, 4.0, 4.0, 7.0, 6.0, 3, 2, 2, 1.0, 3, 5]';%     maxWindSpeed = [15, 12, 10, 5, 5, 5,10, 12, 13, 15, 12,5, 5, 10, 12,  15]';%     avgWindSpeed = [2.8, 2.0, 1.5, 1.2, 1.4, 1.3, 1.45, 2.00, 2.80, 2.80, 1.50, 1.00, 1.0, 1.0, 1.8, 2.0]';%     % dataT = table(windDirections, windFrequency, maxWindSpeed, avgWindSpeed, 'VariableNames', {'风向', '频率', '最大风速', '平均风速'});%     data=[windDirections,windFrequency,maxWindSpeed,avgWindSpeed];%     w=WindRosePlot(data);%     w.plot();%-------------------------------------------------propertiesfig%WindDirections;     %风向WindFrequency;      %刮风频率MaxWindSpeed;       %最大风速AvgWindSpeed;       %平均风速%RGrid='on';         %显示主 r 轴网格线ThetaGrid='on';     %显示主 Theta 轴网格线MinorRGrid='on';    %显示次 r 轴网格线MinorThetaGrid='on';%显示次 Theta 轴网格线%YLabel='风向频率(%)';%  R主网格样式RGridLineStyle='-';RGridColor=[0,0,0];RGridAlpha=1;RGridLineWidth=0.5;% Theta 主网格样式ThetaGridLineStyle='-';ThetaGridColor=[0.8 0.8 0.8];ThetaGridAlpha=1;ThetaGridLineWidth=1.2;% R次网格样式MinorRGridLineStyle=':';MinorRGridColor=[0.55 0.55 0.55];MinorRGridAlpha=1;MinorRGridLineWidth=0.8;% Theta 次网格样式MinorThetaGridLineStyle='-.'MinorThetaGridColor=[0.55 0.55 0.55];MinorThetaGridAlpha=1;MinorThetaGridLineWidth=1.2;% 刻度样式AxisColor=[0,0,0];AxisLineWidth=1.5;AxisMainTickDir='in';AxisMinorTickDir='in';AxisTickLength=0.04;AxisTickFontSize=12;AxisTickFontWeight='normal'%'normal'|'bold'AxisTickFontName='Times new Roman';AxisFaceAlpha=0.5;AxisBackgroundColor=[1,1,1];% 颜色条ColorMaps=[0.0078, 0.0941, 0.7333; 0.9725, 0.0039, 0.5216];ColorMapsTitle='最大风速(m/s)';ColorMapsFontName='Times new Roman';ColorMapsFontSize=12;ColorMapsFontAngle='normal';%'normal' | 'italic'。ColorMapsFontWeight='normal'; %'normal'|'bold'%legend 图列LegendTitle='平均风速(m/s)';LegendBackgroundColor=[1,1,1]*.95;LegendEdgeColor='none';LegendLineWidth=1;LegendFontName='Times new Roman';LegendFontAngle='italic';%'normal' | 'italic'。LegendFontSize=12;LegendFontWeight='normal';LegendRotation=0;endmethodsfunction  obj =WindRosePlot(data)obj.fig=gcf;obj.fig.Color=[1,1,1];obj.WindDirections = data(:,1);obj.WindFrequency = data(:,2);obj.MaxWindSpeed = data(:,3);obj.AvgWindSpeed =data(:,4);%-------------------------obj.RGrid='on';         obj.RGridLineStyle='-';          obj.RGridColor=[0,0,0];                  obj.RGridAlpha=1;         obj.RGridLineWidth=0.5;obj.ThetaGrid='on';     obj.ThetaGridLineStyle='-';      obj.ThetaGridColor=[0.8 0.8 0.8];        obj.ThetaGridAlpha=1;     obj.ThetaGridLineWidth=1.2;obj.MinorRGrid='on';    obj.MinorRGridLineStyle=':';     obj.MinorRGridColor=[0.55 0.55 0.55];    obj.MinorRGridAlpha=1;    obj.MinorRGridLineWidth=0.8;obj.MinorThetaGrid='on';obj.MinorThetaGridLineStyle='-.';obj.MinorThetaGridColor=[0.55 0.55 0.55];obj.MinorThetaGridAlpha=1;obj.MinorThetaGridLineWidth=1.2;obj.ColorMaps = [0.0078, 0.0941, 0.7333; 0.9725, 0.0039, 0.5216];endfunction plot(obj)maxRadius = ceil(max(obj.WindFrequency));minRadius = round(maxRadius / 10);dfT=unique(diff(obj.WindDirections));allTheta = 0:0.01:360;ax = gca;hold on; box off; grid off; axis equal;ax.YLim = [-maxRadius, maxRadius];ax.YMinorTick = 'on';ax.XColor = 'none';ax.XDir = 'normal';ax.TickDir = 'out';ax.LineWidth = obj.AxisLineWidth;ax.YColor=obj.AxisColor;majorTicksY = ax.YTick;minorTicksY = (majorTicksY(1:end-1) + majorTicksY(2:end)) / 2;diffTicks = unique(diff(majorTicksY));maxRadius=max(ax.YTick)+diffTicks/2;ax.YLim = [-maxRadius, maxRadius];%重新设定ax.YAxis.MinorTickValues = [minorTicksY(1)-diffTicks, minorTicksY, minorTicksY(end)+diffTicks];ax.YTickLabel = arrayfun(@(y) sprintf('%d', abs(y)), majorTicksY, 'UniformOutput', false);ax.YLabel.String=obj.YLabel;% =============绘制主要R Theta的极坐标网格线===============================%  # RGridmajorRadius = majorTicksY(majorTicksY > minRadius);if strcmpi(obj.RGrid,'on')for i = 1:length(majorRadius)[xMajor, yMajor] = pol2cart(deg2rad(allTheta), majorRadius(i));plot(xMajor, yMajor,'LineStyle',obj.RGridLineStyle,'Color', [obj.RGridColor obj.RGridAlpha], 'LineWidth',obj.RGridLineWidth);endelseif strcmpi(obj.RGrid,'off')end%   # ThetaGridmajorTheta = obj.WindDirections;fullRadius = linspace(minRadius, maxRadius, 1000);if strcmpi(obj.ThetaGrid,'on')for i = 1:length(majorTheta)[xMajorT, yMajorT] = pol2cart(deg2rad(majorTheta(i)), fullRadius);plot(xMajorT, yMajorT, 'LineStyle',obj.ThetaGridLineStyle, 'Color', [obj.ThetaGridColor obj.ThetaGridAlpha], 'LineWidth', obj.ThetaGridLineWidth);endelseif  strcmpi(obj.ThetaGrid,'off')end% 绘制次要R Theta的极坐标网格线%   # MinorRGridif strcmpi(obj.MinorRGrid,'on')minorRadius = minorTicksY(minorTicksY > minRadius);for i = 1:length(minorRadius)[xMinor, yMinor] = pol2cart(deg2rad(allTheta), minorRadius(i));plot(xMinor, yMinor, 'LineStyle',obj.MinorRGridLineStyle,'Color', [obj.MinorRGridColor obj.MinorRGridAlpha], 'LineWidth',obj.MinorRGridLineWidth);endelseif strcmpi(obj.MinorRGrid,'off')end%   # MinorThetaGridminorTheta=obj.WindDirections+dfT/2;if strcmpi(obj.MinorThetaGrid,'on')for i = 1:length(minorTheta)[xMinorT, yMinorT] = pol2cart(deg2rad(minorTheta(i)), fullRadius);plot(xMinorT, yMinorT, 'LineStyle',obj.MinorThetaGridLineStyle, 'Color', [obj.MinorThetaGridColor obj.MinorThetaGridAlpha], 'LineWidth', obj.MinorThetaGridLineWidth);endelseif strcmpi(obj.MinorThetaGrid,'off')end% ===================绘制刻度===============================% 绘制最外层的极坐标线[xOuter, yOuter] = pol2cart(deg2rad(allTheta), max(ax.YTick)+diffTicks/2);plot(xOuter, yOuter, '-', 'Color',obj.AxisColor, 'LineWidth', obj.AxisLineWidth);fill(xOuter, yOuter,obj.AxisBackgroundColor,'EdgeColor','none','FaceAlpha',obj.AxisFaceAlpha)% #主刻度if obj.AxisTickLength > 1 || obj.AxisTickLength <= 0error('TickLength must be less than 1 and greater than 0.');endif strcmpi(obj.AxisMainTickDir,'in')tickRadius = [maxRadius*(1-obj.AxisTickLength), maxRadius];elseif strcmpi(obj.AxisMainTickDir,'out')tickRadius = [ maxRadius,maxRadius*(1+obj.AxisTickLength)];elseif strcmpi(obj.AxisMainTickDir,'both')tickRadius = [maxRadius*(1-obj.AxisTickLength) maxRadius*(1+obj.AxisTickLength)];elseerror('Invalid value for mainTickDir. It should be "in", "out", or "both".');endmainTickTheta= obj.WindDirections+dfT;for i = 1:length(mainTickTheta)[xMainTick, yMainTick] = pol2cart(deg2rad(mainTickTheta(i)), tickRadius);plot(xMainTick, yMainTick, '-', 'Color', obj.AxisColor, 'LineWidth', obj.AxisLineWidth);enddisp(char([20844 20247 21495 58 22909 29609 30340 77 97 116 108 97 98]))% #次刻度if strcmpi(obj.AxisMinorTickDir,'in')tickRadiusMinor = [maxRadius*(1-obj.AxisTickLength/2), maxRadius];elseif strcmpi(obj.AxisMinorTickDir,'out')tickRadiusMinor = [ maxRadius maxRadius*(1+obj.AxisTickLength/2)];elseif strcmpi(obj.AxisMinorTickDir,'both')tickRadiusMinor = [maxRadius*(1-obj.AxisTickLength/2), maxRadius*(1+obj.AxisTickLength/2)];elseerror('Invalid value for mainTickDir. It should be "in", "out", or "both".');endminorTickTheta=obj.WindDirections+dfT/2;for i = 1:length(minorTickTheta)[xMinorTick, yMinorTick] = pol2cart(deg2rad(minorTickTheta(i)), tickRadiusMinor);plot(xMinorTick, yMinorTick, '-', 'Color', obj.AxisColor, 'LineWidth', obj.AxisLineWidth*0.8);end% ==========添加主刻度外的标签===========================labelDist = maxRadius *(1+ 0.094); % 设定标签距离为最大半径(1+ 0.094),可以根据需要进行调整for i = 1:length(majorTheta)adjustedAngle = majorTheta(i); % 从正北方开始,并且顺时针增加 % 从正北方开始,并且顺时针增加angle = mod(adjustedAngle, 360); % 确保角度在0-360之间[xLabel, yLabel] = pol2cart(deg2rad(90-adjustedAngle), labelDist);labelText = sprintf('%.1f°', angle);text(xLabel, yLabel, labelText, 'HorizontalAlignment', 'center', ...'VerticalAlignment', 'middle', ...'FontSize',obj.AxisTickFontSize,'FontWeight',obj.AxisTickFontWeight,'FontName',obj.AxisTickFontName, ...'Color',obj.AxisColor);end%==================添加数据========================adjustedWindDirections = 360 - obj.WindDirections;[xWind, yWind] = pol2cart(deg2rad(adjustedWindDirections + 90), obj.WindFrequency);colorMapMajor = obj.makeColorMap(obj.ColorMaps, length(obj.WindDirections));% 根据风速大小对颜色进行排序[~, idx] = sort(obj.MaxWindSpeed, 'Ascend');sortedColorMap = colorMapMajor(idx, :);%对于相同的风速值,使用第一个出现的颜色值为其赋色uniqueSpeeds = unique(obj.MaxWindSpeed, 'stable');for i = 1:length(uniqueSpeeds)currentSpeed = uniqueSpeeds(i);indices = find(obj.MaxWindSpeed == currentSpeed);if length(indices) > 1sortedColorMap(indices, :) = repmat(sortedColorMap(indices(1), :), length(indices), 1);endendmaxWind = max(obj.MaxWindSpeed);desiredMaxSize=max(obj.AvgWindSpeed);desiredMinSize=min(obj.AvgWindSpeed);for i = 1:length(obj.WindDirections)color = obj.getColorForSpeed(obj.MaxWindSpeed(i), maxWind , colorMapMajor);s = obj.mapToMarkerSize(obj.AvgWindSpeed(i), desiredMaxSize, desiredMinSize);plot(xWind(i), yWind(i), 'o', 'LineWidth', 1.2, 'MarkerSize',s,...'MarkerEdgeColor', 'k', 'MarkerFaceColor', color);end% ================添加 colorbar======================================colorMapMinor = obj.makeColorMap(obj.ColorMaps, 10);colormap(colorMapMinor);cBar = colorbar;cBar.Position = [.9 .1 .04 .36];cBar.LineWidth = 1.2;cBar.TickLength = 0.025;cBar.Ticks = linspace(floor(min(obj.MaxWindSpeed)),ceil(max(obj.MaxWindSpeed)),11);tickLabels = arrayfun(@(x) sprintf('%.1f', x), cBar.Ticks, 'UniformOutput', false);cBar.TickLabels = tickLabels;cBar.TickDirection = 'both';caxis([floor(min(obj.MaxWindSpeed)),ceil(max(obj.MaxWindSpeed))]);title(cBar, obj.ColorMapsTitle);cBar.FontName= obj.ColorMapsFontName;cBar.FontSize=obj.ColorMapsFontSize;cBar.FontAngle= obj.ColorMapsFontAngle;cBar.FontWeight=obj.ColorMapsFontWeight; %'normal'|'bold'% ===============添加 Legend=======================================legAx=axes(obj.fig,'Position',[.86 0.55 .1 .36],'Color',[1,1,1],'Box','on');title(legAx,obj.LegendTitle)legAx.Color=obj.LegendBackgroundColor;legAx.XColor=obj.LegendEdgeColor;legAx.YColor=obj.LegendEdgeColor;legAx.XTick=[];legAx.YTick=[];legAx.TickLength=[0 0];legAx.LineWidth=obj.LegendLineWidth;% 定义半径和距离legR=linspace(ceil(min(obj.AvgWindSpeed)),ceil(max(obj.AvgWindSpeed)),5);d =ceil(ceil(max(obj.AvgWindSpeed))/2);legY = zeros(1, length(legR));totalHeight = sum(2.*legR) + d*(length(legR)-1);legY(1) = totalHeight/2 - legR(1);for i = 2:length(legR)legY(i) = legY(i-1) - 2*legR(i-1) - d;end% 绘制圆形hold on;for i = 1:length(legR)rectangle('Position',[-legR(i), legY(i)-legR(i), 2*legR(i), 2*legR(i)], 'Curvature', [1, 1],'LineWidth',1.5,'FaceColor', 'white');text(max(legR) + 0.9, legY(i), sprintf('%.1f', legR(i)), ..."FontName",obj.LegendFontName,"FontSize",obj. LegendFontSize,'FontAngle',obj.LegendFontAngle, ...'FontWeight',obj.LegendFontWeight,'Rotation',obj.LegendRotation);endaxis equal;xlim([-max(legR)*1.2 max(legR)*1.2]);ylim([(legY(end)-legR(end))*1.1 (legY(1)+legR(1))*1.1]);hold off;endendmethods(Access=private)function color = getColorForSpeed(obj,speed, maxSpeed, colorMap)idx = round((speed / maxSpeed) * size(colorMap, 1));idx = min(max(idx, 1), size(colorMap, 1)); % 保证idx在正确的范围内color = colorMap(idx, :);endfunction s = mapToMarkerSize(obj,speed, maxSize, minSize)normalized = (speed - minSize)/(maxSize -minSize);s = minSize + normalized * (maxSize - minSize);s=s*10;endfunction cMap=makeColorMap(obj,colorlist,num)color.Num= num;color.list=colorlist;for col=1:size(color.list,2)x=1:size(color.list,1);xi=linspace(1,size(color.list,1),color.Num);color.map(:,col)=interp1(x,color.list(:,col),xi);endcMap=color.map;endend
end

属性:

  • fig:存储图形的句柄。

  • WindDirections:风向数据。

  • WindFrequency:刮风频率。

  • MaxWindSpeed:最大风速数据。

  • AvgWindSpeed:平均风速数据。

  • RGrid,ThetaGrid,MinorRGrid,MinorThetaGrid:这些属性用于控制是否显示对应的网格线。

  • YLabel:Y轴标签。

  • 还有许多其他的属性,例如RGridLineStyle,RGridColor等,用于控制图形的样式和外观。

方法:

  1. 构造函数WindRosePlot:当创建WindRosePlot类的对象时,此构造函数将被调用。构造函数接收风玫瑰数据作为输入,并初始化类的属性。此外,还设置了默认的图形样式。

  2. plot方法:这个方法用于绘制风玫瑰图。它首先设置坐标轴和极坐标的属性。接下来,它会绘制主要和次要的R和Theta网格线。然后,它绘制刻度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/137102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车&#xff0c;搭载3.0L发动机&#xff0c;累计行驶里程约为3.8万km。车主反映&#xff0c;车辆在行驶过程中突然出现发动机抖动且加速无力的现象&#xff0c;于是请求拖车救援。 二、故障诊断 拖车到店后首先试车&#xff0c;发动机怠速轻微抖…

【学习笔记】MySQL死锁及热点行问题

目录 案例优化思路死锁的一些记录笔记热点行问题 本文记录下关于MySQL优化的学习和一点点思考。 案例 一个并发比较大的下单接口&#xff1b; 包括 step1 扣减商品库存step2 生成订单数据step3 记录操作记录 伪代码如下&#xff0c;底层使用的是MySQL数据库&#xff0c;单体服务…

Linux应用开发基础知识——文件IO操作(三)

前言&#xff1a; 在 Linux 系统中&#xff0c;一切都是“文件”&#xff1a;普通文件、驱动程序、网络通信等等。 所有的操作&#xff0c;都是通过“文件 IO”来操作的。所以&#xff0c;很有必要掌握文件操作的常用接口。 目录 一、文件IO 1.什么是文件&#xff1a; 2.怎么…

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图&#xff1a; 卡顿表现有如下几个方面&#xff1a; 网络图片渲染耗时大上下滑动反应慢&#xff0c;甚至画面不动新增一页数据加载渲染时耗时比较大&#xff0c;上下滑动几乎没有反应&#xff0c;画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

绝对力作:解锁string的所有关键接口,万字深度解析!

W...Y的主页 &#x1f60a; &#x1f354;前言&#xff1a; 通过博主的上篇文章&#xff0c;我相信大家已经认识了STL并且已经迫不及待想学习了&#xff0c;现在我们就走近STL的第一种类——string。 目录 为什么学习string类&#xff1f; C语言中的字符串 标准库中的str…

【机器学习】梯度下降预测波士顿房价

文章目录 前言一、数据集介绍二、预测房价代码1.引入库2.数据3.梯度下降 总结 前言 梯度下降算法学习。 一、数据集介绍 波士顿房价数据集&#xff1a;波士顿房价数据集&#xff0c;用于线性回归预测 二、预测房价代码 1.引入库 from sklearn.linear_model import Linear…

筹码穿透率指标选股公式,衡量筹码抛压

在前面的文章中&#xff0c;介绍了博弈K线&#xff0c;它是根据筹码分布的原理结合普通K线的方法绘制出来的。当博弈K线的实体部分比较长的时候&#xff0c;说明当天穿越筹码密集区&#xff0c;有大量的筹码解套。通过引入换手率&#xff0c;可以衡量套牢盘的抛压程度。如果穿越…

Xcode 最好用的 11 个快捷键

今天来分享一下我觉得很好用的 Xcode 12 个快捷键 1. Command Shift O 快速打开&#xff0c;可让你快速导航到项目中的任何文件、函数、变量 2. Command Shift J 快速定位到当前代码所在的文件夹位置&#xff0c;并切换到项目导航器中显示 3. Command Shift Y 快速…

2011年03月31日 Go生态洞察:Godoc —— Go代码的文档化

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

list部分接口模拟实现(c++)

List list简介list基本框架list构造函数list_node结构体的默认构造list类的默认构造 push_back()iteartor迭代器迭代器里面的其他接口const迭代器通过模板参数实现复用operator->() insert()erase()clear()析构函数迭代器区间构造拷贝构造operator() list简介 - list可以在…

【Java】本地开发环境正常、测试或生产环境获取的文件路径不对的问题

引 Java 中经常获取本地文件或者resource下的文件&#xff0c;要获取文件&#xff0c;首先要获得本地路径。 Java 本身或一些开源工具包都提供了很多获取路径的方法。但使用时经常遇到本地开发环境正常、测试或生产环境获取的文件路径不对的问题。 本文将列出几种常见的获取…

python开发过程中注意编码规范~

文章目录 一、 代码编排二、 文档编排三、 空格的使用四、 注释五、 文档描述六、 命名规范总体原则&#xff0c;新编代码必须按下面命名风格进行&#xff0c;现有库的编码尽量保持风格。七 编码建议关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、…

【三维重建】摄像机几何

针孔相机模型 为了方便我们对针孔相机模型进行数学建模&#xff0c;我们往往对虚拟像平面进行研究&#xff0c;因为虚拟像平面的方向与我们实际物体的方向一致。 通过相似三角形法可以得到三维坐标到二维坐标映射 将像平面原点坐标移动到左下角&#xff1a; 加上现实世界单位&a…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

【Linux笔记】Linux环境变量与地址空间

【Linux笔记】Linux环境变量与地址空间 一、命令行参数1.1、main函数的参数1.2、main函数的第三个参数 二、环境变量的概念与内容2.1、环境变量的概念2.2、环境变量的分类2.3、环境变量的组织形式2.4、常见的环境变量 三、设置环境变量3.1、通过命令获取或设置环境变量3.2、通过…

补偿 FIR 滤波器引入的延迟

补偿 FIR 滤波器引入的延迟 对信号进行滤波会引入延迟。这意味着相对于输入&#xff0c;输出信号在时间上有所偏移。此示例向您说明如何抵消这种影响。 有限冲激响应滤波器经常将所有频率分量延迟相同的时间量。这样&#xff0c;我们就很容易通过对信号进行时移处理来针对延迟…

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

目标检测算法 - YOLOv1

文章目录 1. 作者简介2. 目标检测综述3. YOLOv1算法3.1 预测阶段3.2 预测阶段后处理3.3 训练阶段 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。 YOLO是目标检测模型。目标检测是计算机视觉中比较简单的任务&#xff0c;用…

OpenHarmony创新赛|赋能直播第五期

OpenHarmony创新赛赋能直播课程即将再次与大家见面&#xff01;本期基于之前的青蛙影院的UI界面设计的课程&#xff0c;介绍综合性APP的需求介绍和技术栈整合等内容。此外&#xff0c;课程同步赋能OpenHarmony创新赛&#xff0c;为参赛开发者带来新的思路和方法&#xff0c;也欢…

卷积神经网络中 6 种经典卷积操作

深度学习的模型大致可以分为两类&#xff0c;一类是卷积神经网络&#xff0c;另外一类循环神经网络&#xff0c;在计算机视觉领域应用最多的就是卷积神经网络&#xff08;CNN&#xff09;。CNN在图像分类、对象检测、语义分割等经典的视觉任务中表现出色&#xff0c;因此也早就…