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库的配置及生成统计图表:折线图柱状图饼状图

前端Vue+Element UI案例:通用后台管理系统-Echarts图表:折线图柱状图饼状图

拓端tecdat|R语言在地图上绘制月亮图饼状图数据可视化果蝇基因种群