伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

Matlab实现绘制有气泡感的网络图

目录

    教程部分
      0 数据准备1 根底绘图2 气泡大小3 气泡颜色4 气泡其他属性5 连线配色6 添加节点及类标签7 标签间隔8 设置字体
    工具函数完好代码

今天给大家带来一款用来绘制有气泡感的网络图的工具函数,绘制效果如下:
Matlab实现绘制有气泡感的网络图-1.jpg

花里胡哨的,气泡大小代表流入流出数据量总和,不同颜色的气泡代表属于不同类,两个气泡之间有连线代表有数据活动,连线透明度代表活动数据量,连线的颜色是有方向性的渐变色。
照旧完好代码放在文末。

教程部分


0 数据准备

数据需要的关系矩阵需要的是反对称矩阵:
  1. % 随机生成100x100的反对角矩阵
  2. Data=(rand(100)-.5).*(rand(100)>.978);
  3. Data(1:30,:)=Data(1:30,:).*3;
  4. Data=tril(Data)-tril(Data)';
  5. % 生成100x1列向量,分类标签为1-10
  6. Class=(1:10).*ones(10,1);
  7. Class=Class(:);
复制代码
1 根底绘图

两行代码完事:
  1. % 根底绘图
  2. BD=bubbleDigraph(Data,Class);
  3. BD=BD.draw();
复制代码
Matlab实现绘制有气泡感的网络图-2.jpg


2 气泡大小

可以使用bubblesize函数设置气泡大小范围,例如:
  1. bubblesize([5,40])
复制代码
Matlab实现绘制有气泡感的网络图-3.jpg


3 气泡颜色

使用setBubbleColor函数设置颜色:
  1. BD.setBubbleColor(turbo(10))
复制代码
Matlab实现绘制有气泡感的网络图-4.jpg


4 气泡其他属性

可以使用setBubble函数停止设置,bubblechart图形对象具有的属性均可以修改:
  1. BD.setBubble('MarkerFaceAlpha',.2,'MarkerEdgeColor',[0,0,0])
复制代码
Matlab实现绘制有气泡感的网络图-5.jpg


5 连线配色

直接使用colormap函数即可设置:
  1. colormap(bone)
复制代码
Matlab实现绘制有气泡感的网络图-6.jpg


6 添加节点及类标签

分别使用:
    NodeNameClassName
俩属性设置两种标签:
  1. for i=1:100
  2.     nodeName{i}=[num2str(Class(i)),'-',num2str(i)];
  3. end
  4. className={'AAAAA','BBBBB','CCCCC','DDDDD','EEEEE','FFFFF','GGGGG','HHHHH','IIIII','JJJJJ'};
  5. BD=bubbleDigraph(Data,Class,'NodeName',nodeName,'ClassName',className);
  6. BD=BD.draw();
  7. bubblesize([5,25])
复制代码
Matlab实现绘制有气泡感的网络图-7.jpg


7 标签间隔

分别通过:
    RNodeRClass
俩属性设置两种标签间隔中心的间隔:
  1. BD=bubbleDigraph(Data,Class,'NodeName',nodeName,'ClassName',className,'RClass',1.38,'RNode',1.2);
  2. BD=BD.draw();
复制代码
Matlab实现绘制有气泡感的网络图-8.jpg


8 设置字体

分别使用:
    setNodeLabelsetClassLabel
俩函数设置两种标签的属性:
  1. BD.setNodeLabel('FontName','Cambria','Color',[0,0,.8])
  2. BD.setClassLabel('FontName','Cambria','Color',[.8,0,0],'FontSize',14)
复制代码
Matlab实现绘制有气泡感的网络图-9.jpg


工具函数完好代码
  1. classdef bubbleDigraph
  2. % @author : slandarer
  3. % 公众号  : slandarer随笔
  4. % Zhaoxu Liu / slandarer (2023). bubble digraph
  5. % (https://www.mathworks.com/matlabcentral/fileexchange/125140-bubble-digraph),
  6. % MATLAB Central File Exchange. 检索来源 2023/2/21.
  7.     properties
  8.         ax,arginList={'ColorOrder','Colormap','ClassName','NodeName','BubbleSize','RClass','RNode'}
  9.         ClassName   % 类名称
  10.         NodeName    % 节点名称
  11.         % 节点配色
  12.         ColorOrder=[0.6510    0.8078    0.8902;    0.1216    0.4706    0.7059;    0.6980    0.8745    0.5412
  13.                     0.2000    0.6275    0.1725;    0.9843    0.6039    0.6000;    0.8902    0.1020    0.1098
  14.                     0.9922    0.7490    0.4353;    1.0000    0.4980         0;    0.7922    0.6980    0.8392
  15.                     0.4157    0.2392    0.6039;    1.0000    1.0000    0.6000;    0.6941    0.3490    0.1569];
  16.         % 连线配色
  17.         Colormap=[1.0000    0.9686    0.9529;    0.9980    0.9454    0.9307;    0.9960    0.9221    0.9084;    0.9939    0.8988    0.8861
  18.                   0.9920    0.8750    0.8630;    0.9910    0.8477    0.8336;    0.9900    0.8204    0.8043;    0.9890    0.7930    0.7750;   
  19.                   0.9877    0.7629    0.7502;    0.9857    0.7245    0.7390;    0.9837    0.6860    0.7279;    0.9817    0.6476    0.7168;   
  20.                   0.9793    0.6027    0.7022;    0.9762    0.5470    0.6820;    0.9732    0.4913    0.6617;    0.9701    0.4357    0.6415;   
  21.                   0.9555    0.3815    0.6263;    0.9292    0.3289    0.6162;    0.9028    0.2763    0.6061;    0.8765    0.2237    0.5960;   
  22.                   0.8369    0.1717    0.5763;    0.7894    0.1201    0.5510;    0.7418    0.0684    0.5257;    0.6942    0.0168    0.5004;   
  23.                   0.6429    0.0039    0.4888;    0.5903    0.0039    0.4817;    0.5376    0.0039    0.4746;    0.4850    0.0039    0.4676;   
  24.                   0.4350    0.0030    0.4552;    0.3855    0.0020    0.4420;    0.3359    0.0010    0.4288;    0.2863         0    0.4157];
  25.         Data,Class          % 有向图及节点分类
  26.         BubbleSize=[5,25];  % 节点气泡大小范围[min,max]
  27.         LineWidth=1.5;      % 连接线粗细
  28.         AlphaLim=[.1,.9];
  29.         ClassSet,ClassNum,
  30.         RClass=1.25;
  31.         RNode=1.08;
  32.         ColorList;
  33.         bubbleHdl,nodeLabelHdl,classLabelHdl
  34.     end
  35.     methods
  36.         function obj=bubbleDigraph(Data,Class,varargin)
  37.             obj.Data=Data;
  38.             obj.Class=Class(:);
  39.             obj.ClassSet=unique(Class);
  40.             obj.ClassNum=length(obj.ClassSet);
  41.             for i=1:size(obj.Data,1)
  42.                 obj.NodeName{i}='';
  43.             end
  44.             for i=1:obj.ClassNum
  45.                 obj.ClassName{i}='';
  46.             end
  47.             % 获取其他数据
  48.             disp(char([64 97 117 116 104 111 114 32 58 32,...
  49.                  115 108 97 110 100 97 114 101 114]))
  50.             for i=1:2:(length(varargin)-1)
  51.                 tid=ismember(obj.arginList,varargin{i});
  52.                 if any(tid)
  53.                     obj.(obj.arginList{tid})=varargin{i+1};
  54.                 end
  55.             end
  56.             if obj.ClassNum>size(obj.ColorOrder,1)
  57.                 obj.ColorOrder=[obj.ColorOrder;rand([obj.ClassNum,3])];
  58.             end
  59.         end
  60.         function obj=draw(obj)
  61.             obj.ax=gca;hold on;
  62.             colormap(obj.Colormap)
  63.             obj.ax.XLim=[-1.2,1.2];
  64.             obj.ax.YLim=[-1.2,1.2];
  65.             obj.ax.XTick=[];
  66.             obj.ax.YTick=[];
  67.             obj.ax.XColor='none';
  68.             obj.ax.YColor='none';
  69.             obj.ax.PlotBoxAspectRatio=[1,1,1];
  70.             % 调整初始界面大小
  71.             fig=obj.ax.Parent;
  72.             fig.Color=[1,1,1];
  73.             if max(fig.Position(3:4))<600
  74.                 fig.Position(3:4)=1.8.*fig.Position(3:4);
  75.                 fig.Position(1:2)=fig.Position(1:2)./3;
  76.             end
  77.             % 绘制气泡
  78.             thetaList=linspace(0,2*pi,size(obj.Data,1)+1);thetaList(end)=[];
  79.             XList=cos(thetaList);YList=sin(thetaList);
  80.             obj.bubbleHdl=bubblechart(XList,YList,sum(abs(obj.Data)));
  81.             bubblesize(obj.BubbleSize)
  82.             obj.ColorList=zeros(size(obj.Data,1),3);
  83.             for i=1:length(obj.ClassSet)
  84.                 obj.ColorList(obj.Class==obj.ClassSet(i),:)=...
  85.                     repmat(obj.ColorOrder(i,:),sum(obj.Class==obj.ClassSet(i)),1);
  86.             end
  87.             obj.bubbleHdl.CData=obj.ColorList;
  88.             % 绘制连线
  89.             alphaData=abs(obj.Data);
  90.             alphaData=alphaData-min(min(alphaData));
  91.             alphaData=alphaData./max(max(alphaData));
  92.             alphaData=alphaData.*(obj.AlphaLim(2)-obj.AlphaLim(1))+obj.AlphaLim(1);
  93.             for i=1:size(obj.Data,1)
  94.                 for j=1:i-1
  95.                     if obj.Data(i,j)~=0
  96.                         bezierX=[cos(thetaList(i)),0,cos(thetaList(j))].*.93;
  97.                         bezierY=[sin(thetaList(i)),0,sin(thetaList(j))].*.93;
  98.                         bezierPnts=bezierCurve([bezierX',bezierY'],100);
  99.                         bezierX=[bezierPnts(:,1);nan];
  100.                         bezierY=[bezierPnts(:,2);nan];
  101.                         fill(bezierX,bezierY,linspace(-1,1,101).*obj.Data(i,j)./abs(obj.Data(i,j)),'EdgeColor','interp',...
  102.                             'LineWidth',obj.LineWidth,'EdgeAlpha',alphaData(i,j))
  103.                     end
  104.                 end
  105.             end
  106.             % 绘制节点标签
  107.             for i=1:size(obj.Data,1)
  108.                 Ti=thetaList(i);
  109.                 rotation=Ti/pi*180;
  110.                 if rotation>90&&rotation<270
  111.                     rotation=rotation+180;
  112.                     obj.nodeLabelHdl(i)=text(cos(Ti).*obj.RNode,sin(Ti).*obj.RNode,obj.NodeName{i},...
  113.                         'Rotation',rotation,'HorizontalAlignment','right','FontSize',9);
  114.                 else
  115.                     obj.nodeLabelHdl(i)=text(cos(Ti).*obj.RNode,sin(Ti).*obj.RNode,obj.NodeName{i},...
  116.                         'Rotation',rotation,'FontSize',9);
  117.                 end
  118.             end
  119.             % 绘制类标签
  120.             for i=1:obj.ClassNum
  121.                 CTi=mean(thetaList(obj.Class==obj.ClassSet(i)));
  122.                 rotation=CTi/pi*180;
  123.                 if rotation>0&&rotation<180
  124.                     obj.classLabelHdl(i)=text(cos(CTi).*obj.RClass,sin(CTi).*obj.RClass,obj.ClassName{i},'FontSize',14,'FontName','Arial',...
  125.                     'HorizontalAlignment','center','Rotation',-(.5*pi-CTi)./pi.*180);
  126.                 else
  127.                     obj.classLabelHdl(i)=text(cos(CTi).*obj.RClass,sin(CTi).*obj.RClass,obj.ClassName{i},'FontSize',14,...
  128.                     'HorizontalAlignment','center','Rotation',-(1.5*pi-CTi)./pi.*180);
  129.                 end
  130.             end
  131.             % 贝塞尔函数
  132.             function pnts=bezierCurve(pnts,N)
  133.                 t=linspace(0,1,N);
  134.                 p=size(pnts,1)-1;
  135.                 coe1=factorial(p)./factorial(0:p)./factorial(p:-1:0);
  136.                 coe2=((t).^((0:p)')).*((1-t).^((p:-1:0)'));
  137.                 pnts=(pnts'*(coe1'.*coe2))';
  138.             end
  139.         end
  140.         % 修改气泡颜色
  141.         function obj=setBubbleColor(obj,ColorList)
  142.             obj.ColorOrder=ColorList;
  143.             for i=1:length(obj.ClassSet)
  144.                 obj.ColorList(obj.Class==obj.ClassSet(i),:)=...
  145.                     repmat(obj.ColorOrder(i,:),sum(obj.Class==obj.ClassSet(i)),1);
  146.             end
  147.             set(obj.bubbleHdl,'CData',obj.ColorList);
  148.         end
  149.         % 修改气泡其他属性
  150.         function obj=setBubble(obj,varargin)
  151.             set(obj.bubbleHdl,varargin{:});
  152.         end
  153.         % 设置标签
  154.         function setNodeLabel(obj,varargin)
  155.             for i=1:size(obj.Data,1)
  156.                 set(obj.nodeLabelHdl(i),varargin{:});
  157.             end
  158.         end
  159.         function setClassLabel(obj,varargin)
  160.             for i=1:obj.ClassNum
  161.                 set(obj.classLabelHdl(i),varargin{:});
  162.             end
  163.         end
  164.     end
  165. % @author : slandarer
  166. % 公众号  : slandarer随笔
  167. % Zhaoxu Liu / slandarer (2023). bubble digraph
  168. % (https://www.mathworks.com/matlabcentral/fileexchange/125140-bubble-digraph),
  169. % MATLAB Central File Exchange. 检索来源 2023/2/21.
  170. end
复制代码
file exchange链接:Zhaoxu Liu / slandarer (2023). bubble digraph (https://www.mathworks.com/matlabcentral/fileexchange/125140-bubble-digraph), MATLAB Central File Exchange. 检索来源 2023/2/21.
到此这篇关于Matlab实现绘制有气泡感的网络图的文章就介绍到这了,更多相关Matlab绘制网络图内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

萌晓许
注册会员
主题 22
回复 14
粉丝 0
|网站地图
快速回复 返回顶部 返回列表