• 【花式】基于Matlab画带有阴影的饼状图


    1 内容介绍

    数据可视化领域,饼状图是一种常用的方式来展示各个类别在总体中所占的比例。然而,有时候我们希望给饼状图添加一些额外的信息,以增强其表达能力。在本文中,我们将介绍如何使用Matlab绘制带有阴影效果的饼状图。

    Matlab是一种功能强大的数值计算和可视化工具,它提供了丰富的绘图函数和选项,使我们能够以灵活而直观的方式呈现数据。在开始之前,请确保您已经安装了Matlab,并且具备基本的编程知识。

    首先,我们需要准备一些数据来绘制饼状图。假设我们有四个类别,它们在总体中的比例分别为25%,30%,20%和25%。我们可以使用Matlab的向量来表示这些比例:

     
    

    data = [25, 30, 20, 25];

    接下来,我们需要计算每个类别所对应的角度。饼状图的每个扇形的角度大小与其所占比例成正比。我们可以使用Matlabpie函数来计算这些角度,并绘制饼状图:

     
    

    figure; pie(data);

    运行上述代码后,您将看到一个简单的饼状图,其中包含了四个扇形,每个扇形代表一个类别,并且它们的角度大小与其所占比例相对应。

    然而,我们的目标是为这个饼状图添加阴影效果,以增强其可读性和美观性。为了实现这一目标,我们可以使用Matlab的patch函数来绘制每个扇形的阴影。

    首先,我们需要计算每个扇形的坐标。我们可以使用饼状图的半径和角度来计算扇形的外边界坐标。然后,我们可以使用patch函数绘制扇形的阴影。

     
    

    radius = 1; % 饼状图的半径 angles = cumsum(data/sum(data)*2*pi); % 计算每个类别对应的角度 angles = [0, angles]; % 添加起始角度 hold on; for i = 1:length(data) x = [0, radius*cos(angles(i)), radius*cos(angles(i+1))]; % 计算扇形的x坐标 y = [0, radius*sin(angles(i)), radius*sin(angles(i+1))]; % 计算扇形的y坐标 patch(x, y, 'k', 'FaceAlpha', 0.3); % 绘制阴影 end hold off;

    运行上述代码后,您将看到一个带有阴影效果的饼状图。每个扇形的阴影将增强其立体感,并使其更加突出。

    除了阴影效果,我们还可以通过调整阴影的透明度、颜色和位置来进一步定制饼状图。Matlab提供了丰富的选项,使我们能够根据自己的需求进行调整。

    综上所述,使用Matlab绘制带有阴影的饼状图是一种简单而强大的方式来展示数据。通过添加阴影效果,我们可以增强饼状图的表达能力,并使其更加美观。希望本文能帮助您在数据可视化中更好地使用Matlab。如果您有任何问题或建议,请随时与我们分享。谢谢阅读!

    2 完整代码

    clc
    clear all
    close all
    X=[1 3 0.5 2.5 2];

    SP=shadowPie(X,'ShadowType',{'/','.','|','+','x'});
    SP=SP.draw(); 

    classdef shadowPie

        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=varargin{1};varargin(1)=[];
                if any(strcmpi('shadowType',varargin))
                    tind=find(strcmpi('shadowType',varargin));
                    obj.shadowType=varargin{tind+1};
                    varargin([tind,tind+1])=[];
                else
                    obj.shadowType=obj.shadowTypeList;
                end
                if any(strcmpi('lineNum',varargin))
                    tind=find(strcmpi('lineNum',varargin));
                    obj.lineNum=varargin{tind+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];
                        obj.oriPieHdl(i).LineWidth=.8;
                        tPolyPhape=polyshape(obj.oriPieHdl(i).XData,obj.oriPieHdl(i).YData);
                        tType=mod(n-1,length(obj.shadowType))+1;
                        switch obj.shadowType{tType}
                            case '\'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.lL_X1(k),1.5;obj.lL_X2(k),-1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case '/'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.lL_X1(k),-1.5;obj.lL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case '_'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[-1.5,obj.hL_X1(k);1.5,obj.hL_X2(k)]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case '|'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.hL_X1(k),-1.5;obj.hL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot(tXX(:),tYY(:),'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case '+'
                                tXX1=zeros([3,obj.lineNum]);tYY1=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[-1.5,obj.hL_X1(k);1.5,obj.hL_X2(k)]);
                                    if ~isempty(in)
                                        tXX1(:,k)=[in(1,1);in(end,1);nan];
                                        tYY1(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX1(:,k)=[nan;nan;nan];
                                        tYY1(:,k)=[nan;nan;nan];
                                    end     
                                end
                                tXX2=zeros([3,obj.lineNum]);tYY2=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.hL_X1(k),-1.5;obj.hL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX2(:,k)=[in(1,1);in(end,1);nan];
                                        tYY2(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX2(:,k)=[nan;nan;nan];
                                        tYY2(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot([tXX1(:);nan;tXX2(:)],[tYY1(:);nan;tYY2(:)],'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case 'x'
                                tXX1=zeros([3,obj.lineNum]);tYY1=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.cL_X1(k),1.5;obj.cL_X2(k),-1.5]);
                                    if ~isempty(in)
                                        tXX1(:,k)=[in(1,1);in(end,1);nan];
                                        tYY1(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX1(:,k)=[nan;nan;nan];
                                        tYY1(:,k)=[nan;nan;nan];
                                    end     
                                end
                                tXX2=zeros([3,obj.lineNum]);tYY2=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.cL_X1(k),-1.5;obj.cL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX2(:,k)=[in(1,1);in(end,1);nan];
                                        tYY2(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX2(:,k)=[nan;nan;nan];
                                        tYY2(:,k)=[nan;nan;nan];
                                    end     
                                end
                                plot([tXX1(:);nan;tXX2(:)],[tYY1(:);nan;tYY2(:)],'Color',[0,0,0],'LineWidth',.5,'Tag','pieShadow')
                            case '.'
                                 tXX=obj.XMesh(:);tYY=obj.YMesh(:);
                                 tbool=isinterior(tPolyPhape,tXX(:),tYY(:));
                                 scatter(tXX(tbool),tYY(tbool),2,'filled','o','MarkerEdgeColor','none','MarkerFaceColor',[0,0,0],'Tag','pieShadow')
                            case 'w'
                                obj.oriPieHdl(i).FaceColor=[1,1,1];
                            case 'k' 
                                obj.oriPieHdl(i).FaceColor=[0,0,0];
                            case 'g'
                                obj.oriPieHdl(i).FaceColor=[.5,.5,.5];
                        end
                        n=n+1;
                    end
                end
            end
            function obj=legend(obj,cellStr,varargin)
                obj.nonePieHdl=pie(obj.XData,obj.otherProp{:});
                nn=1;
                for n=1:length(obj.nonePieHdl)
                    if isa(obj.nonePieHdl(n),'matlab.graphics.primitive.Patch')
                        obj.nonePieHdl(n).FaceColor='none';
                        obj.nonePieHdl(n).EdgeColor='none';
                        newNonePieHdl(nn)=obj.nonePieHdl(n);
                        nn=nn+1;
                    else
                        obj.nonePieHdl(n).Visible='off';
                    end
                end
                obj.oriLegend=legend(newNonePieHdl,cellStr,varargin{:});
                obj.oriLegend.AutoUpdate='off';
                obj.oriLegend.Box='off';
                obj.ax.XLim=obj.ax.XLim;
                obj.ax.YLim=obj.ax.YLim;

                % 框重定位
                tlgdPos=obj.oriLegend.Position;
                taxPos=obj.ax.Position;
                taxXLim=obj.ax.XLim;
                taxYLim=obj.ax.YLim;
                tfigRate=obj.ax.Parent.Position(3:4);
                tfigRate=tfigRate.*taxPos(3:4);tfigRate=tfigRate./min(tfigRate);
                taxXLim=taxXLim.*tfigRate(1);
                taxYLim=taxYLim.*tfigRate(2);

                tXYMin=(tlgdPos(1:2)-taxPos(1:2))./taxPos(3:4).*[diff(taxXLim),diff(taxYLim)]+[taxXLim(1),taxYLim(1)];
                tXYMax=(tlgdPos(1:2)+tlgdPos(3:4)-taxPos(1:2))./taxPos(3:4).*[diff(taxXLim),diff(taxYLim)]+[taxXLim(1),taxYLim(1)];
                boxHdl=fill([tXYMin(1),tXYMax(1),tXYMax(1),tXYMin(1)],[tXYMin(2),tXYMin(2),tXYMax(2),tXYMax(2)],[1,1,1],'Tag','lgdBox');

                for n=1:length((obj.newPieHdl))
                    ttType=mod(n-1,length(obj.shadowType))+1;
                    squareHdl(n)=fill([0,0,0],[0,0,0],[1,1,1],'EdgeColor',[0,0,0],'LineWidth',.7,'Tag','pieBox');
                    if strcmp(obj.shadowType{ttType},'.')
                        lgdLineHdl(n)=scatter(0,0,2,'filled','o','MarkerEdgeColor','none','MarkerFaceColor',[0,0,0],'Tag','pieShadow');
                    else
                        lgdLineHdl(n)=plot(0,0,'Color',[0,0,0],'LineWidth',.5,'Tag','barBox','Tag','pieShadow');
                    end
                end
                moveLgd()
                set(obj.ax.Parent,'WindowButtonMotionFcn',@moveLgd);
                function moveLgd(~,~)
                    % 框重定位
                    lgdPos=obj.oriLegend.Position;
                    axPos=obj.ax.Position;
                    axXLim=obj.ax.XLim;
                    axYLim=obj.ax.YLim;
                    figRate=obj.ax.Parent.Position(3:4);
                    figRate=figRate.*axPos(3:4);figRate=figRate./min(figRate);
                    axXLim=axXLim.*figRate(1);
                    axYLim=axYLim.*figRate(2);

                    XYMin=(lgdPos(1:2)-axPos(1:2))./axPos(3:4).*[diff(axXLim),diff(axYLim)]+[axXLim(1),axYLim(1)];
                    XYMax=(lgdPos(1:2)+lgdPos(3:4)-axPos(1:2))./axPos(3:4).*[diff(axXLim),diff(axYLim)]+[axXLim(1),axYLim(1)];
                    boxHdl.XData=[XYMin(1),XYMax(1),XYMax(1),XYMin(1)];
                    boxHdl.YData=[XYMin(2),XYMin(2),XYMax(2),XYMax(2)];

                    Y=XYMin(2)+(XYMax(2)-XYMin(2)).*linspace(1/length(obj.newPieHdl)/2+1/50,1-1/length(obj.newPieHdl)/2-1/50,length(obj.newPieHdl));
                    obj.XYRate=diff(obj.ax.YLim)./diff(obj.ax.XLim);

                    PBA=obj.ax.PlotBoxAspectRatio(2)./obj.ax.PlotBoxAspectRatio(1)./0.7896;
                    Y=fliplr(Y);
                    for i=1:length((obj.newPieHdl))
                        tX=XYMin(1)+(XYMax(2)-XYMin(2))./2./length(obj.newPieHdl).*[1/10,.95,.95,1/10].*(PBA./obj.XYRate.*3);
                        tY=Y(i)+0.75.*[-1,-1,1,1].*(XYMax(2)-XYMin(2))./2./length(obj.newPieHdl);
                        squareHdl(i).XData=tX;
                        squareHdl(i).YData=tY;

                        tPolyPhape=polyshape(tX,tY);
                        tType=mod(i-1,length(obj.shadowType))+1;

                        switch obj.shadowType{tType}
                            case '\'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.lL_X1(k),1.5;obj.lL_X2(k),-1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=tXX(:);
                                lgdLineHdl(i).YData=tYY(:);
                            case '/'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.lL_X1(k),-1.5;obj.lL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=tXX(:);
                                lgdLineHdl(i).YData=tYY(:);
                            case '_'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[-1.5,obj.hL_X1(k);1.5,obj.hL_X2(k)]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=tXX(:);
                                lgdLineHdl(i).YData=tYY(:);
                            case '|'
                                tXX=zeros([3,obj.lineNum]);tYY=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.hL_X1(k),-1.5;obj.hL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX(:,k)=[in(1,1);in(end,1);nan];
                                        tYY(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX(:,k)=[nan;nan;nan];
                                        tYY(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=tXX(:);
                                lgdLineHdl(i).YData=tYY(:);
                            case '+'
                                tXX1=zeros([3,obj.lineNum]);tYY1=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[-1.5,obj.hL_X1(k);1.5,obj.hL_X2(k)]);
                                    if ~isempty(in)
                                        tXX1(:,k)=[in(1,1);in(end,1);nan];
                                        tYY1(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX1(:,k)=[nan;nan;nan];
                                        tYY1(:,k)=[nan;nan;nan];
                                    end
                                end
                                tXX2=zeros([3,obj.lineNum]);tYY2=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.hL_X1(k),-1.5;obj.hL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX2(:,k)=[in(1,1);in(end,1);nan];
                                        tYY2(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX2(:,k)=[nan;nan;nan];
                                        tYY2(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=[tXX1(:);nan;tXX2(:)];
                                lgdLineHdl(i).YData=[tYY1(:);nan;tYY2(:)];
                            case 'x'
                                tXX1=zeros([3,obj.lineNum]);tYY1=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.cL_X1(k),1.5;obj.cL_X2(k),-1.5]);
                                    if ~isempty(in)
                                        tXX1(:,k)=[in(1,1);in(end,1);nan];
                                        tYY1(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX1(:,k)=[nan;nan;nan];
                                        tYY1(:,k)=[nan;nan;nan];
                                    end
                                end
                                tXX2=zeros([3,obj.lineNum]);tYY2=zeros([3,obj.lineNum]);
                                for k=1:obj.lineNum
                                    [in,~]=intersect(tPolyPhape,[obj.cL_X1(k),-1.5;obj.cL_X2(k),1.5]);
                                    if ~isempty(in)
                                        tXX2(:,k)=[in(1,1);in(end,1);nan];
                                        tYY2(:,k)=[in(1,2);in(end,2);nan];
                                    else
                                        tXX2(:,k)=[nan;nan;nan];
                                        tYY2(:,k)=[nan;nan;nan];
                                    end
                                end
                                lgdLineHdl(i).XData=[tXX1(:);nan;tXX2(:)];
                                lgdLineHdl(i).YData=[tYY1(:);nan;tYY2(:)];
                            case '.'
                                tXX=obj.XMesh(:);tYY=obj.YMesh(:);
                                tbool=isinterior(tPolyPhape,tXX(:),tYY(:));
                                lgdLineHdl(i).XData=tXX(tbool);
                                lgdLineHdl(i).YData=tYY(tbool);
                            case 'w'
                                squareHdl(i).FaceColor=[1,1,1];
                            case 'k'
                                squareHdl(i).FaceColor=[0,0,0];
                            case 'g'
                                squareHdl(i).FaceColor=[.5,.5,.5];
                        end
                    end
                end

            end
        end
    end

    3 运行结果

    4 参考文献

    博主简介:擅长智能优化算法神经网络预测信号处理元胞自动机图像处理路径规划无人机雷达通信无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

    部分理论引用网络文献,若有侵权联系博主删除。

  • 相关阅读:
    微服务项目:尚融宝(37)(核心业务流程:用户绑定(2))
    解锁被锁的Oracle用户
    云原生Kubernetes:pod进阶之资源管理与探针
    实现微信机器人开发,个微api
    postgresql中uuid的使用
    Docker面试整理-如何进行Docker镜像的构建和发布?
    2024采用JSP的酒店客房管理系统源代码+毕业设计论文+开题报告+答辩PPT
    【JavaWeb】登录页面记住密码,账号或密码错误
    中间件环境搭建配置过程解读
    Object静态方法
  • 原文地址:https://blog.csdn.net/qq_59747472/article/details/126934546