MATLAB | 面积图饼状图水平柱状图的斜线填充(阴影填充)
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 面积图饼状图水平柱状图的斜线填充(阴影填充)相关的知识,希望对你有一定的参考价值。
没想到叭,阴影柱状图仅仅一天就迎来了(1.5.1)版本,已经支持水平柱状图绘制!!同时本人又连夜赶制了另外两款相关的阴影图绘制函数:
来来来,后文马上介绍一下这三款函数。
另:代码开发基于polyshape
对象,阴影柱状图绘制函数理论上需要至少R2017b
及之后版本才能使用(越新越好)。(polyshape yyds)
区域填充函数
先讲解此函数如何使用,再在此部分最后给出完整代码:
基本使用
设置为角度为pi/3,80根线条进行填充:
t=0:.01:2*pi;
X=cos(t);
Y=sin(t);
plot(X,Y,'LineWidth',2);
hold on;axis equal
shadowFill(X,Y,pi/3,80);
绘制阴影面积图
t=0:.01:2*pi;
y=sin(t);
plot(t,y,'LineWidth',2);
hold on;axis equal
shadowFill(t,y,pi/4,80);
绘制两函数中间区域
这个就比较复杂了,给个例子:
t=-.1:.01:pi/2;
y1=sin(t).*2;
y2=t.^2;
hold on
plot(t,y1,'LineWidth',2);
plot(t,y2,'LineWidth',2);
diffy=y1-y2;
tpos=find(diffy>=0);
T=[t(tpos(1):tpos(end)),t(tpos(end):-1:tpos(1))];
Y=[y1(tpos(1):tpos(end)),y2(tpos(end):-1:tpos(1))];
shadowFill(T,Y,pi/5,70);
设置填充颜色和格式
t=-.1:.01:pi/2;
y1=sin(t).*2;
y2=t.^2;
hold on
plot(t,y1,'LineWidth',2);
plot(t,y2,'LineWidth',2);
diffy=y1-y2;
tpos=find(diffy>=0);
T=[t(tpos(1):tpos(end)),t(tpos(end):-1:tpos(1))];
Y=[y1(tpos(1):tpos(end)),y2(tpos(end):-1:tpos(1))];
shadowFill(T,Y,pi/5,70,'LineStyle',':','Color',[.2,.2,.9]);
工具函数完整代码
function SF=shadowFill(X,Y,theta,num,varargin)
% @author : slandarer
% gzh : slandarer随笔
if theta>pi/2||theta<-pi/2
error('Inner theta should be in range of [-pi/2,pi/2]');
end
% 基础属性获取
ax=gca;hold on;
try
pshape=polyshape(X,Y);
catch
end
XYmin=[min(X),min(Y)];
XYmax=[max(X),max(Y)];
diffY=max(Y)-min(Y);
% 获取阴影线数值
if abs(theta)<eps
YY=linspace(XYmin(2),XYmax(2),num);
tXX=zeros(3,num);tYY=zeros(3,num);
for i=1:num
[in,~]=intersect(pshape,[XYmin(1),YY(i);XYmax(2),YY(i)]);
if ~isempty(in)
tXX(:,i)=[in(1,1);in(end,1);nan];
tYY(:,i)=[in(1,2);in(end,2);nan];
else
tXX(:,i)=[nan;nan;nan];
tYY(:,i)=[nan;nan;nan];
end
end
else
cott=cot(theta);
XX1=linspace(XYmin(1)-cott.*diffY,XYmax(1),num);
XX2=linspace(XYmin(1),XYmax(1)+cott.*diffY,num);
tXX=zeros(3,num);tYY=zeros(3,num);
for i=1:num
[in,~]=intersect(pshape,[XX1(i),XYmin(2);XX2(i),XYmax(2)]);
if ~isempty(in)
tXX(:,i)=[in(1,1);in(end,1);nan];
tYY(:,i)=[in(1,2);in(end,2);nan];
else
tXX(:,i)=[nan;nan;nan];
tYY(:,i)=[nan;nan;nan];
end
end
end
% 绘制阴影
SF=plot(ax,tXX(:),tYY(:),'LineWidth',.5,'Color',[0,0,0],varargin:,'Tag','shadowFill');
end
阴影饼状图
阴影有:
\\
,/
,_
,|
,+
,x
,.
,w
,k
,g
十种格式,可以自己都试一下:
基本使用
X=[1 3 0.5 2.5 2];
SP=shadowPie(X,'ShadowType','/','.','|','+','x');
SP=SP.draw();
带偏移饼图
X=[1 3 0.5 2.5 2];
explode=[0 1 0 5 0];
SP=shadowPie(X,explode,'ShadowType','/','.','|','+','x');
SP=SP.draw();
添加图例
X=[1 3 0.5 2.5 2];
explode=[0 1 0 5 0];
SP=shadowPie(X,explode,'ShadowType','/','.','|','+','x');
SP=SP.draw();
SP.legend('AAA','BBB','CCC','DDD','EEE','FontSize',13,'FontName','Cambria');
图例可能会被标签信息挡住,可以自行拖拽图例到其他位置:
基本修饰
阴影、柱状图框、图例框分别具有pieShadow
,pieBox
,lgdBox
的标签,使用findobj
获取对象并循环修饰即可,不过为了绘制更好看,部分阴影使用plot
绘制部分则是使用scatter
绘制,因此阴影修饰时要用if先检测一下格式,给个示例:
X=[1 3 0.5 2.5 2];
explode=[0 1 0 5 0];
SP=shadowPie(X,explode,'ShadowType','/','.','|','+','x');
SP=SP.draw();
SP.legend('AAA','BBB','CCC','DDD','EEE','FontSize',13,'FontName','Cambria');
% 修饰文字
textHdl=findobj('Tag','pieText');
for i=1:length(textHdl)
textHdl(i).FontName='Cambria';
textHdl(i).FontSize=14;
textHdl(i).Color=[0,0,.8];
end
% 修饰阴影变成红色并加粗
shadowHdl=findobj('Tag','pieShadow');
for i=1:length(shadowHdl)
if isa(shadowHdl(i),'matlab.graphics.chart.primitive.Line')
shadowHdl(i).Color=[.8,.6,.6];
shadowHdl(i).LineWidth=1;
else
shadowHdl(i).MarkerFaceColor=[.8,.6,.6];
shadowHdl(i).SizeData=5;
end
end
光看上面代码大佬们应该就已经懂了咋用,如果比较小白,可以直接使用MATLAB自带的属性修饰器:
点击:查看->属性编辑器
点击选中对象即可立即修饰颜色、粗细等各种格式:
工具函数完整代码
classdef shadowPie
% @author : slandarer
% gzh : slandarer随笔
properties
ax,XData,num
shadowTypeList='\\','/','_','|','+','x','.','w','k','g'
shadowType % 阴影类型
otherProp % 其他初始属性
oriPieHdl % 原始图形句柄
newPieHdl
pshapeHdl % polyshape图形句柄
lineNum=85 % 阴影基础线数量
oriLegend;XYRate;nonePieHdl
lL_X1;lL_X2;cL_X1;cL_X2;hL_X1;hL_X2;XMesh;YMesh
end
methods
function obj=shadowPie(varargin)
% 基础属性设置
obj.XData=varargin1;varargin(1)=[];
if any(strcmpi('shadowType',varargin))
tind=find(strcmpi('shadowType',varargin));
obj.shadowType=varargintind+1;
varargin([tind,tind+1])=[];
else
obj.shadowType=obj.shadowTypeList;
end
if any(strcmpi('lineNum',varargin))
tind=find(strcmpi('lineNum',varargin));
obj.lineNum=varargintind+1;
varargin([tind,tind+1])=[];
end
obj.otherProp=varargin;
obj.num=length(obj.XData);
help shadowPie
end
function obj=draw(obj)
% 基础绘图
obj.oriPieHdl=pie(obj.XData,obj.otherProp:);
obj.ax=gca;hold(obj.ax,'on');
% 一些基础线
obj.lL_X1=linspace(-1.5-6,1.5,obj.lineNum);
obj.lL_X2=linspace(-1.5,1.5+6,obj.lineNum);
obj.cL_X1=linspace(-1.5-3,1.5,obj.lineNum);
obj.cL_X2=linspace(-1.5,1.5+3,obj.lineNum);
obj.hL_X1=linspace(-1.5,1.5,obj.lineNum);
obj.hL_X2=linspace(-1.5,1.5,obj.lineNum);
[obj.XMesh,obj.YMesh]=meshgrid(linspace(-1.5,1.5,obj.lineNum));
n=1;
for i=1:length(obj.oriPieHdl)
if isa(obj.oriPieHdl(i),'matlab.graphics.primitive.Patch')
obj.newPieHdl(n)=obj.oriPieHdl(i);
obj.oriPieHdl(i).Tag='pieBox';
n=n+1;
else
obj.oriPieHdl(i).Tag='pieText';
end
end
n=1;
for i=1:length(obj.oriPieHdl)
if isa(obj.oriPieHdl(i),'matlab.graphics.primitive.Patch')
obj.oriPieHdl(i).FaceColor=[1,1,1在winform中如何生成饼状图和柱状图?
GlobalMapper精品教程057:制作全国各省七普人口柱状图饼状图直线图直方图
PHP jpgraph库的配置及生成统计图表:折线图柱状图饼状图