桑基图 Matlab

 ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,

代码获取、论文复现及科研仿真合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab完整代码及仿真定制内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

🔥 内容介绍

桑基图是一种用于描述复杂系统的图形化工具,它可以帮助人们更好地理解系统中各个因素之间的关系。桑基图最初是由美国工程师马修·桑基在1898年提出的,他在一篇名为《桑基图及其应用》的论文中首次介绍了这种图表。自那时起,桑基图已经被广泛应用于各个领域,包括工程、管理、经济学和环境科学等。

桑基图通常由一系列水平和垂直的条形组成,每个条形代表系统中的一个因素或变量。这些条形之间的宽度表示不同因素之间的关系强度或者数量的差异。通过观察桑基图,人们可以清晰地看到系统中各个因素之间的相互作用,从而更好地理解系统的运作机制。

桑基图的应用范围非常广泛,其中最常见的用途之一是在项目管理中。通过绘制桑基图,项目经理可以清晰地了解项目中各个任务之间的依赖关系,从而更好地安排工作流程和资源分配。此外,桑基图也被广泛应用于市场营销领域,帮助企业分析不同产品或服务之间的竞争关系和市场份额。

除了在商业领域中的应用,桑基图也在环境科学和可持续发展领域发挥着重要作用。通过绘制桑基图,研究人员可以更好地理解不同因素之间的相互影响,从而提出更有效的环境保护和资源管理方案。此外,桑基图还可以帮助政府和决策者更好地了解社会经济系统中各种因素之间的关系,从而制定更科学的政策和规划。

尽管桑基图在许多领域都有着广泛的应用,但它也存在一些局限性。例如,当系统中的因素过多或者关系过于复杂时,绘制桑基图可能会变得非常困难。此外,桑基图只能描述因果关系,而无法提供系统内部的详细信息。因此,在使用桑基图时,人们需要结合其他工具和方法,以全面地理解系统的运作机制。

总的来说,桑基图作为一种图形化工具,为人们提供了更直观的方式来理解复杂系统。它在各个领域都有着广泛的应用,帮助人们更好地分析和解决问题。随着技术的不断进步和人们对系统复杂性的深入理解,桑基图将继续发挥着重要的作用,并为人们带来更多的启发和帮助。​

📣 完整代码

clcclear allclose allfigure('Name','sankey demo1','Units','normalized','Position',[.05,.2,.5,.56])links={'a1','A',1.2;'a2','A',1;'a1','B',.6;'a3','A',1; 'a3','C',0.5;       'b1','B',.4; 'b2','B',1;'b3','B',1; 'c1','C',1;       'c2','C',1;  'c3','C',1;'A','AA',2; 'A','BB',1.2;       'B','BB',1.5; 'B','AA',1.5; 'C','BB',2.3; 'C','AA',1.2};% 创建桑基图对象(Create a Sankey diagram object)SK=SSankey(links(:,1),links(:,2),links(:,3));% 修改链接颜色渲染方式(Set link color rendering method)% 'left'/'right'/'interp'(default)/'map'/'simple'SK.RenderingMethod='interp';  % 修改对齐方式(Set alignment)% 'up'/'down'/'center'(default)SK.Align='center';% 修改文本位置(Set Text Location)% 'left'(default)/'right'/'top'/'center'/'bottom'SK.LabelLocation='top';SK.Sep=.2;% 开始绘图(Start drawing)SK.draw()
classdef SSankey < handle% =========================================================================% -------------------------------------------------------------------------    properties        Source;Target;Value;        SourceInd;TargetInd;        Layer;LayerPos;        AdjMat;BoolMat;        RenderingMethod='interp'  % 'left'/'right'/'interp'/'map'/'simple'        LabelLocation='left'      % 'left'/'right'/'top'/'center'/'bottom'        Align='center'            % 'up'/'down'/'center'        BlockScale=0.05;          %  BlockScale>0 ! !        Sep=0.05;                 %  Sep>=0 ! !        NodeList={};        ColorList=[[65,140,240;252,180,65;224,64,10;5,100,146;191,191,191;26,59,105;255,227,130;18,156,221;                    202,107,75;0,92,219;243,210,136;80,99,129;241,185,168;224,131,10;120,147,190]./255;                   [127,91,93;187,128,110;197,173,143;59,71,111;104,95,126;76,103,86;112,112,124;                    72,39,24;197,119,106;160,126,88;238,208,146]./255];        BlockHdl;LinkHdl;LabelHdl;ax;Parent;        BN;LN;VN;TotalLen;SepLen;        arginList={'RenderingMethod','LabelLocation','BlockScale',...                   'Sep','Align','ColorList','Parent','NameList'}    end% 构造函数 =================================================================    methods        function obj=SSankey(varargin)            % 获取基本数据 -------------------------------------------------            if isa(varargin{1},'matlab.graphics.axis.Axes')                obj.ax=varargin{1};varargin(1)=[];            else              end            obj.Source=varargin{1};            obj.Target=varargin{2};            obj.Value=varargin{3};            varargin(1:3)=[];            % 获取其他信息 -------------------------------------------------            for i=1:2:(length(varargin)-1)                tid=ismember(obj.arginList,varargin{i});                if any(tid)                obj.(obj.arginList{tid})=varargin{i+1};                end            end            if isempty(obj.ax)&&(~isempty(obj.Parent)),obj.ax=obj.Parent;end            if isempty(obj.ax),obj.ax=gca;end            obj.ax.NextPlot='add';            % 基本数据预处理 -----------------------------------------------            if isempty(obj.NodeList)                obj.NodeList=[obj.Source;obj.Target];                obj.NodeList=unique(obj.NodeList,'stable');            end            obj.BN=length(obj.NodeList);            if length(obj.NodeList)>size(obj.ColorList,1)                obj.ColorList=[obj.ColorList;rand(length(obj.NodeList),3).*.7];            end            obj.VN=length(obj.Value);            % 坐标区域基础设置 ---------------------------------------------            obj.ax.YDir='reverse';            obj.ax.XColor='none';            obj.ax.YColor='none';        end% 绘图函数 =================================================================        function draw(obj)            % 生成整体邻接矩阵 ---------------------------------------------            obj.AdjMat=zeros(obj.BN,obj.BN);            for i=1:length(obj.Source)                obj.SourceInd(i)=find(strcmp(obj.Source{i},obj.NodeList));                obj.TargetInd(i)=find(strcmp(obj.Target{i},obj.NodeList));                obj.AdjMat(obj.SourceInd(i),obj.TargetInd(i))=obj.Value{i};            end            obj.BoolMat=abs(obj.AdjMat)>0;            % 计算每个对象位于的层、每层方块长度、每个方块位置 ----------------            obj.Layer=zeros(obj.BN,1);            obj.Layer(sum(obj.BoolMat,1)==0)=1;            startMat=diag(obj.Layer);            for i=1:(obj.BN-1)                tLayer=(sum(startMat*obj.BoolMat^i,1)>0).*(i+1);                obj.Layer=max([obj.Layer,tLayer'],[],2);            end            obj.LN=max(obj.Layer);            obj.TotalLen=max([sum(obj.AdjMat,1).',sum(obj.AdjMat,2)],[],2);            obj.SepLen=max(obj.TotalLen).*obj.Sep;            obj.LayerPos=zeros(obj.BN,4);            for i=1:obj.LN                tBlockInd=find(obj.Layer==i);                tBlockLen=[0;cumsum(obj.TotalLen(tBlockInd))];                tY1=tBlockLen(1:end-1)+(0:length(tBlockInd)-1).'.*obj.SepLen;                tY2=tBlockLen(2:end)+(0:length(tBlockInd)-1).'.*obj.SepLen;                obj.LayerPos(tBlockInd,3)=tY1;                obj.LayerPos(tBlockInd,4)=tY2;                % for j=1:length(tY2)                %     plot([i,i],[tY1(j),tY2(j)],'LineWidth',2)                % end            end            obj.LayerPos(:,1)=obj.Layer;            obj.LayerPos(:,2)=obj.Layer+obj.BlockScale;            % 根据对齐方式调整Y坐标 -----------------------------------------            tMinY=min(obj.LayerPos(:,3));            tMaxY=max(obj.LayerPos(:,4));            for i=1:obj.LN                tBlockInd=find(obj.Layer==i);                tBlockPos3=obj.LayerPos(tBlockInd,3);                tBlockPos4=obj.LayerPos(tBlockInd,4);                switch obj.Align                    case 'up'                    case 'down'                        obj.LayerPos(tBlockInd,3)=obj.LayerPos(tBlockInd,3)+tMaxY-max(tBlockPos4);                        obj.LayerPos(tBlockInd,4)=obj.LayerPos(tBlockInd,4)+tMaxY-max(tBlockPos4);                    case 'center'                        obj.LayerPos(tBlockInd,3)=obj.LayerPos(tBlockInd,3)+...                            min(tBlockPos3)/2-max(tBlockPos4)/2+tMinY/2-tMaxY/2;                        obj.LayerPos(tBlockInd,4)=obj.LayerPos(tBlockInd,4)+...                            min(tBlockPos3)/2-max(tBlockPos4)/2+tMinY/2-tMaxY/2;                end            end            % 绘制连接 -----------------------------------------------------            for i=1:obj.VN                tSource=obj.SourceInd(i);                tTarget=obj.TargetInd(i);                tS1=sum(obj.AdjMat(tSource,1:(tTarget-1)))+obj.LayerPos(tSource,3);                tS2=sum(obj.AdjMat(tSource,1:tTarget))+obj.LayerPos(tSource,3);                tT1=sum(obj.AdjMat(1:(tSource-1),tTarget))+obj.LayerPos(tTarget,3);                tT2=sum(obj.AdjMat(1:tSource,tTarget))+obj.LayerPos(tTarget,3);                if isempty(tS1),tS1=0;end                if isempty(tT1),tT1=0;end                tX=[obj.LayerPos(tSource,1),obj.LayerPos(tSource,2),obj.LayerPos(tTarget,1),obj.LayerPos(tTarget,2)];                qX=linspace(obj.LayerPos(tSource,1),obj.LayerPos(tTarget,2),200);qT=linspace(0,1,50);                qY1=interp1(tX,[tS1,tS1,tT1,tT1],qX,'pchip');                qY2=interp1(tX,[tS2,tS2,tT2,tT2],qX,'pchip');                XX=repmat(qX,[50,1]);YY=qY1.*(qT'.*0+1)+(qY2-qY1).*(qT');                MeshC=ones(50,200,3);                switch obj.RenderingMethod                    case 'left'                        MeshC(:,:,1)=MeshC(:,:,1).*obj.ColorList(tSource,1);                        MeshC(:,:,2)=MeshC(:,:,2).*obj.ColorList(tSource,2);                        MeshC(:,:,3)=MeshC(:,:,3).*obj.ColorList(tSource,3);                    case 'right'                        MeshC(:,:,1)=MeshC(:,:,1).*obj.ColorList(tTarget,1);                        MeshC(:,:,2)=MeshC(:,:,2).*obj.ColorList(tTarget,2);                        MeshC(:,:,3)=MeshC(:,:,3).*obj.ColorList(tTarget,3);                    case 'interp'                        MeshC(:,:,1)=repmat(linspace(obj.ColorList(tSource,1),obj.ColorList(tTarget,1),200),[50,1]);                        MeshC(:,:,2)=repmat(linspace(obj.ColorList(tSource,2),obj.ColorList(tTarget,2),200),[50,1]);                        MeshC(:,:,3)=repmat(linspace(obj.ColorList(tSource,3),obj.ColorList(tTarget,3),200),[50,1]);                    case 'map'                        MeshC=MeshC(:,:,1).*obj.Value{i};                    case 'simple'                        MeshC(:,:,1)=MeshC(:,:,1).*.6;                        MeshC(:,:,2)=MeshC(:,:,2).*.6;                        MeshC(:,:,3)=MeshC(:,:,3).*.6;                end                obj.LinkHdl(i)=surf(obj.ax,XX,YY,XX.*0,'EdgeColor','none','FaceAlpha',.3,'CData',MeshC);            end            % 绘制方块 -----------------------------------------------------            for i=1:obj.BN                obj.BlockHdl(i)=fill(obj.ax,obj.LayerPos(i,[1,2,2,1]),...                    obj.LayerPos(i,[3,3,4,4]),obj.ColorList(i,:),'EdgeColor','none');            end            % 绘制文本 -----------------------------------------------------            for i=1:obj.BN                switch obj.LabelLocation                    case 'right'                        obj.LabelHdl(i)=text(obj.ax,obj.LayerPos(i,2),mean(obj.LayerPos(i,[3,4])),...                            [' ',obj.NodeList{i}],'FontSize',15,'FontName','Times New Roman','HorizontalAlignment','left');                    case 'left'                        obj.LabelHdl(i)=text(obj.ax,obj.LayerPos(i,1),mean(obj.LayerPos(i,[3,4])),...                            [obj.NodeList{i},' '],'FontSize',15,'FontName','Times New Roman','HorizontalAlignment','right');                    case 'top'                        obj.LabelHdl(i)=text(obj.ax,mean(obj.LayerPos(i,[1,2])),obj.LayerPos(i,3),...                            obj.NodeList{i},'FontSize',15,'FontName','Times New Roman','HorizontalAlignment','center','VerticalAlignment','bottom');                    case 'center'                        obj.LabelHdl(i)=text(obj.ax,mean(obj.LayerPos(i,[1,2])),mean(obj.LayerPos(i,[3,4])),...                            obj.NodeList{i},'FontSize',15,'FontName','Times New Roman','HorizontalAlignment','center');                    case 'bottom'                        obj.LabelHdl(i)=text(obj.ax,mean(obj.LayerPos(i,[1,2])),obj.LayerPos(i,4),...                            obj.NodeList{i},'FontSize',15,'FontName','Times New Roman','HorizontalAlignment','center','VerticalAlignment','top');                end            end            % -------------------------------------------------------------            axis tight;help SSankey        end% =========================================================================        function setBlock(obj,n,varargin)            set(obj.BlockHdl(n),varargin{:})        end        function setLink(obj,n,varargin)            set(obj.LinkHdl(n),varargin{:})        end        function setLabel(obj,n,varargin)            set(obj.LabelHdl(n),varargin{:})        end        function moveBlockY(obj,n,dy)            obj.LayerPos(n,[3,4])=obj.LayerPos(n,[3,4])-dy;            set(obj.BlockHdl(n),'YData',obj.LayerPos(n,[3,3,4,4]));            switch obj.LabelLocation                case 'right',set(obj.LabelHdl(n),'Position',[obj.LayerPos(n,2),mean(obj.LayerPos(n,[3,4]))]);                case 'left',set(obj.LabelHdl(n),'Position',[obj.LayerPos(n,1),mean(obj.LayerPos(n,[3,4]))]);                case 'top',set(obj.LabelHdl(n),'Position',[mean(obj.LayerPos(n,[1,2])),obj.LayerPos(n,3)]);                case 'center',set(obj.LabelHdl(n),'Position',[mean(obj.LayerPos(n,[1,2])),mean(obj.LayerPos(n,[3,4]))]);                case 'bottom',set(obj.LabelHdl(n),'Position',[mean(obj.LayerPos(n,[1,2])),obj.LayerPos(n,4)]);            end            for i=1:obj.VN                tSource=obj.SourceInd(i);                tTarget=obj.TargetInd(i);                if tSource==n||tTarget==n                    tS1=sum(obj.AdjMat(tSource,1:(tTarget-1)))+obj.LayerPos(tSource,3);                    tS2=sum(obj.AdjMat(tSource,1:tTarget))+obj.LayerPos(tSource,3);                    tT1=sum(obj.AdjMat(1:(tSource-1),tTarget))+obj.LayerPos(tTarget,3);                    tT2=sum(obj.AdjMat(1:tSource,tTarget))+obj.LayerPos(tTarget,3);                    if isempty(tS1),tS1=0;end                    if isempty(tT1),tT1=0;end                    tX=[obj.LayerPos(tSource,1),obj.LayerPos(tSource,2),obj.LayerPos(tTarget,1),obj.LayerPos(tTarget,2)];                    qX=linspace(obj.LayerPos(tSource,1),obj.LayerPos(tTarget,2),200);qT=linspace(0,1,50);                    qY1=interp1(tX,[tS1,tS1,tT1,tT1],qX,'pchip');                    qY2=interp1(tX,[tS2,tS2,tT2,tT2],qX,'pchip');                    YY=qY1.*(qT'.*0+1)+(qY2-qY1).*(qT');                    set(obj.LinkHdl(i),'YData',YY);                end            end        end    end% -------------------------------------------------------------------------end

⛳️ 运行结果

🔗 参考文献

🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁  关注我领取海量matlab电子书和数学建模资料

👇  私信完整代码、论文复现、期刊合作、论文辅导及科研仿真定制

1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化
2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
2.图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
3 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化
4 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配、无人机安全通信轨迹在线优化
5 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化
6 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化
7 电力系统方面
微电网优化、无功优化、配电网重构、储能配置
8 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长
9 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值