当前位置:网站首页>如何使用MATLAB绘制极坐标堆叠柱状图
如何使用MATLAB绘制极坐标堆叠柱状图
2022-08-03 15:58:00 【slandarer】
极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar
绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图,而且极坐标下fill
函数也不能用,于是就考虑将数据进行累加,并多次调用polarhistogram
函数进行绘图,我将这个过程变为了一个方便调用的类。
以下先说明这个类该咋用,之后再给出类的完整代码:
part1: 函数介绍
基本使用
h的每一行代表要绘制一层柱状图的数据,这里要绘制三层的堆叠柱状图:
h1=randi([8,18],[1,35])+rand([1,35]);
h2=randi([2,8],[1,35])+rand([1,35]);
h3=randi([0,3],[1,35])+rand([1,35]);
h=[h1;h2;h3];
wr=windrose(h);% 构造堆叠图类
wr=wr.draw(); % 绘图
其中wr=windrose(h)
是构造类的过程,第一个输入可以是高度矩阵,也可以是当前的极坐标区域,绘制的角度范围可以省略。
角度范围
构造函数的角度范围可以省略,默认范围为 [ 0 , 2 π ] [0,2\pi] [0,2π],以下两种写法是等同的:
wr=windrose(h)
wr=wr.draw()
wr=windrose(h,[0,2*pi])
wr=wr.draw()
调节到 [ 0 , π ] [0,\pi] [0,π]:
wr=windrose(h,[0,pi])
wr=wr.draw()
**不均匀角度:**比数据长度多1的角度序列,角度值要求 [ 0 , 2 π ] [0,2\pi] [0,2π]范围:
wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
wr=wr.draw()
常用函数:改变样式
基本上的线条颜色,线条透明度,面透明度,线条粗细等patch
对象具有的一系列属性,均可以依靠此setStyle
函数设置:
- 线条颜色: EdgeColor
- 线条透明度: EdgeAlpha
- 面透明度: FaceAlpha
- 线条粗细:LineWidth
% 随机数据生成并拼成矩阵
h1=randi([8,18],[1,35])+rand([1,35]);
h2=randi([2,8],[1,35])+rand([1,35]);
h3=randi([0,3],[1,35])+rand([1,35]);
h=[h1;h2;h3];
wr=windrose(h);% 构造堆叠图类
wr=wr.draw(); % 绘图
% 图像属性设置
wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
常用函数:设置下界
就是添加一个圆形把中心区域密集的线条遮盖一下,例如想要设置下界限为4,可以再之前代码最后加入:
wr.setLConf(4)
常用函数:修改颜色
修改一个颜色:(例)修改第二层的颜色:
wr.setColor([.1,.8,.1],2)
修改多个颜色:(例)修改第一、三层的颜色:
wr.setColor([0,.2,0;0 0 .2],[1,3])
添加图例
请使用返回对象的Children
属性添加图例:
% 添加图例
lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
lgd.Location='best';
part2: 完整类函数代码
classdef windrose
% @author : slandarer
% 公众号 : slandarer随笔
%
% 使用实例:
% =========================================================================
% % 随机数据生成并拼成矩阵
% h1=randi([8,18],[1,35])+rand([1,35]);
% h2=randi([2,8],[1,35])+rand([1,35]);
% h3=randi([0,3],[1,35])+rand([1,35]);
% h=[h1;h2;h3];
%
% wr=windrose(h);% 等同于 wr=windrose(h,[0,2*pi]);
% % wr=windrose(h,[0:5:30,31:1:59]./59.*2.*pi);
% wr=wr.draw();
%
% wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
% wr.setLConf(4)
%
% % 将第二层变成绿
% % wr.setColor([.1,.8,.1],2)
% % 将第一第二层变成黑色
% % wr.setColor([0,.2,0;0 0 .2],[1,3])
%
% % 添加图例
% lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
% lgd.Location='best';
properties
HSet % mxn 大小数据,m组数据,每组n个柱
ThetaSet % 1x(n+1) 分隔角度
histType % 可初始化属性
LConfHdl % 下边界图形对象
Parent
Children
end
methods
function obj=windrose(varargin)
% 变量数据读取及传入
if isa(varargin{
1},'matlab.graphics.axis.PolarAxes')
ax=varargin{
1};varargin(1)=[];
else
ax=polaraxes(gcf);
end
hold on
obj.Parent=ax;
obj.HSet=varargin{
1};varargin(1)=[];
if ~isempty(varargin)&&isfloat(varargin{
1})
if length(varargin{
1})==2
obj.ThetaSet=linspace(varargin{
1}(1),varargin{
1}(2),size(obj.HSet,2)+1);
else
obj.ThetaSet=varargin{
1};
end
varargin(1)=[];
else
obj.ThetaSet=linspace(0,2*pi,size(obj.HSet,2)+1);
end
obj.histType=varargin;
end
function obj=draw(obj) % 循环绘图
tCoLorList=lines(size(obj.HSet,1));
tHSet=cumsum(obj.HSet);
for i=size(obj.HSet,1):-1:1
obj.Children(i)=polarhistogram(obj.Parent,'BinEdges',...
obj.ThetaSet,'BinCounts',tHSet(i,:),'FaceAlpha',1,'FaceColor',tCoLorList(i,:),obj.histType{
:});
end
% -------------------------------------------------------------
% 绘制下边界圆形
obj.LConfHdl=polarhistogram(obj.Parent,'BinEdges',linspace(0,2*pi,101),...
'BinCounts',ones([1,100]),'FaceColor','none','FaceAlpha',1,'EdgeColor','none');
end
% =========================================================================
function setStyle(obj,varargin) % 设置属性
for i=1:length(obj.Children)
set(obj.Children(i),varargin{
:});
end
end
function setLConf(obj,LConf)% 设置下边界
if strcmp(LConf,'none')
obj.LConfHdl.FaceColor='none';
else
obj.LConfHdl.FaceColor=obj.Parent.Color;
obj.LConfHdl.BinCounts=ones([1,100]).*LConf;
end
end
function setColor(obj,colorList,n)% 颜色
k=1;
for i=n
set(obj.Children(i),'FaceColor',colorList(k,:));
k=k+1;
end
end
end
end
part3: 两个使用示例
示例一
% windrose demo 1
% 随机数据生成并拼成矩阵
h1=randi([8,18],[1,35])+rand([1,35]);
h2=randi([2,8],[1,35])+rand([1,35]);
h3=randi([0,3],[1,35])+rand([1,35]);
h=[h1;h2;h3];
wr=windrose(h);
wr=wr.draw();
% 图像属性设置
wr.setStyle('LineWidth',1.2,'FaceAlpha',.8,'EdgeColor',[.2,.2,.2])
% 添加下界限
wr.setLConf(4)
% 将第二层变成绿
% wr.setColor([.1,.8,.1],2)
% 将第一第二层变成黑色
% wr.setColor([0,.2,0;0 0 .2],[1,3])
% 添加图例
lgd=legend(wr.Children,'CLASS 1','CLASS 2','CLASS 3');
lgd.Location='best';
% 坐标区域修饰
ax=gca;
ax.LineWidth=1.5;
ax.GridLineStyle='-.';
ax.FontName='Cambria';
ax.FontSize=13;
示例二
% windrose demo 2
% 随机数据生成并拼成矩阵
h1=randi([8,18],[1,35])+rand([1,35]);
h2=randi([2,8],[1,35])+rand([1,35]);
h3=randi([0,3],[1,35])+rand([1,35]);
h=[h1;h2;h3];
% 生成极坐标区域,并更改背景颜色
ax=polaraxes(gcf);
ax.Color=[60,60,60]./255;
ax.GridColor=[212,217,217]./255;
ax.LineWidth=1.5;
ax.GridLineStyle='-.';
ax.FontName='Cambria';
ax.FontSize=13;
% 生成风玫瑰图
wr=windrose(ax,h);
wr=wr.draw();
% 属性修饰
wr.setStyle('LineWidth',1.2,'FaceAlpha',1,'EdgeColor',[.2,.2,.2])
wr.setLConf(4)
% 修改颜色
colorList=[194,196,191;
212,217,217;
110,135,117]./255;
wr.setColor(colorList,1:3)
完
边栏推荐
- Leetcode76. 最小覆盖子串
- 字典表(还需要输入2个字)
- 我在滴滴做开源
- 【Unity入门计划】基本概念(6)-精灵渲染器 Sprite Renderer
- 生态剧变,电子签名SaaS模式迎来新突破,网络效应加速到来
- 一文看懂推荐系统:召回02:Swing 模型,和itemCF很相似,区别在于计算相似度的方法不一样
- AI+BI+Visualization, Deep Analysis of Sugar BI Architecture
- Small Tools (4) integrated Seata1.5.2 distributed transactions
- MPLS的wpn实验
- 土耳其国防部:联合协调中心将对首艘乌克兰粮船进行安全检查
猜你喜欢
随机推荐
袁小林:沃尔沃专注于出行的安全感,并且把它做到极致
【Unity入门计划】基本概念(8)-瓦片地图 TileMap 01
Basic knowledge points in js - events
Leetcode76. Minimal Covering Substring
高压直流输电(HVDC)的最优潮流(OPF)(Matlab代码实现)
[Unity Getting Started Plan] Basic Concepts (8) - Tile Map TileMap 02
技术干货|如何将 Pulsar 数据快速且无缝接入 Apache Doris
聊聊这个SaaS领域爆火的话题
JS基础--判断
泰山OFFICE技术讲座:文字边框高度研究
一个文件管理系统的软硬件配置清单
How to get the 2 d space prior to ViT?UMA & Hong Kong institute of technology & ali SP - ViT, study for visual Transformer 2 d space prior knowledge!.
13 and OOM simulation
Why do I strongly recommend using smart async?
DC-DC 2C(40W/30W) JD6606SX2退功率应用
Small Tools (4) integrated Seata1.5.2 distributed transactions
如何启动 NFT 集合
leetcode:899. 有序队列【思维题】
Ruoyi Ruoyi framework @DataScope annotation use and some problems encountered
leetcode-268.丢失的数字