绘制效果

全网唯一这四个字我都快说腻了,请叫我绘图小天才,又双叒叕写了一个工具函数发到了MATHWORKS,矩形树状图主要用于直观展示各个元素的分类和占比。

编写不易点个叭~~


基本使用

需要准备一组大于0的数据,以及每个数据的分类情况,例如我随即生成50个数据并将其随机分到1-5类中,占比越大的类绘制出来越靠近左下角:

% 随机生成数据及分类
Data=rand(1,50).*linspace(10,100,50);
Class=randi([1,5],[50,1]);
% 绘图
CT=rectTree(Data,Class);
CT=CT.draw();

可以看出如果没有特意设置各个类的名字和各个元素的名字,各类就会取名Class n各个元素就会显示占这个类的比例。

设置类名和元素名

举个实例

Data=[1;3;2;6;3;7;2;5;6;8;9;2;4;4;6;1;5;9;1;2;6;9;4;1;4];
Class=randi([1,5],[25,1]);
for i=1:length(Data)Name{i}=['p',num2str(i)];
end
ClassName={'AAAAA','BBBBB','CCCCC','DDDDD','EEEEE'};CT=rectTree(Data,Class,'Name',Name,'ClassName',ClassName);
CT=CT.draw();

色块颜色设置

使用setColor(N,color)设置每一类的颜色,例如设置第五类为蓝色:

CT.setColor(5,[.1,.1,.7]);

色块其他属性设置

使用setPatch(varargin)设置其他属性,patch对象具有的属性均可被设置(例如把边缘变成白色):

CT.setPatch('EdgeColor',[1,1,1])

字体设置

使用

  • setFont(varargin)
  • setLabel(varargin)

分别设置元素标签和类标签的字体,举个例子:

CT.setFont('FontName','Cambria','FontSize',16)
CT.setLabel('FontName','Cambria','FontSize',25,'Color',[0,0,.8])

工具函数完整代码

classdef rectTree
% @author : slandarer
% gzh : slandarer随笔 propertiesax,Data,Class,varargin,CS,HS,index,hdlSetarginList={'ColorOrder','Name','ClassName'}classNum=1;classSet=[];classRatio=[];ColorOrder=[80,118,169;226,144,50;127,167,58;242,86,54;126,109,167;196,98,37;74,148,189;255,182,46;161,86,144;134,138,33;240,73,53;90,123,207;254,147,44;186,79,115;35,170,102]./255;Name=[];ClassName=[];posSet=zeros(0,4); endmethodsfunction obj=rectTree(Data,Class,varargin)obj.Data=Data(:);obj.Class=Class(:);obj.classSet=unique(Class);obj.classNum=length(obj.classSet);obj.Name{length(Class)}='';% 计算比例for i=1:obj.classNumobj.classRatio(i)=sum(obj.classSet(i)==obj.Class);endobj.classRatio=obj.classRatio./sum(obj.classRatio);% 获取其他数据for i=1:2:(length(varargin)-1)tid=ismember(obj.arginList,varargin{i});if any(tid)obj.(obj.arginList{tid})=varargin{i+1};endend[~,tind]=sort(obj.classRatio,'descend');obj.classRatio=obj.classRatio(tind);obj.classSet=obj.classSet(tind);if length(obj.ClassName)<obj.classNumfor i=1:obj.classNumobj.ClassName{i}=['Class ',num2str(i)];endendobj.index=tind;obj.ClassName=obj.ClassName(tind);obj.varargin=varargin;endfunction obj=draw(obj)obj.ax=gca;hold onobj.ax.XLim=[0,1];obj.ax.YLim=[0,1];obj.ax.XTick=[];obj.ax.YTick=[];obj.ax.XColor='none';obj.ax.YColor='none';obj.ax.PlotBoxAspectRatio=[1,1,1];% =============================================================% 计算各类位置(obj.posSet)tClassRatio=obj.classRatio;tCumClassRatio=cumsum(tClassRatio);meanPos=[0,0,1,1];typeInd=1;for i=1:obj.classNump5Index=find(tCumClassRatio>.5,1);switch(typeInd)case 1tPos=meanPos;meanPos=tPos;compPos=tPos;meanPos(3)=tPos(3).*tCumClassRatio(p5Index);compPos(1)=tPos(1)+tPos(3).*tCumClassRatio(p5Index);compPos(3)=tPos(3).*(1-tCumClassRatio(p5Index));    case 0tPos=meanPos;meanPos=tPos;compPos=tPos;meanPos(4)=tPos(4).*tCumClassRatio(p5Index);compPos(2)=tPos(2)+tPos(4).*tCumClassRatio(p5Index);compPos(4)=tPos(4).*(1-tCumClassRatio(p5Index));endtClassPartRatio=tCumClassRatio(1:p5Index);disp(char([64 97 117 116 104 111 114 32 58 32 115 108 97 110 100 97 114 101 114]))tClassPartRatio=[0,tClassPartRatio./max(tClassPartRatio)];for j=1:p5Indexswitch(typeInd)case 1tPos=meanPos;obj.posSet=[obj.posSet;tPos(1),tPos(2)+tPos(4)*tClassPartRatio(j),...tPos(3),tPos(4)*(tClassPartRatio(j+1)-tClassPartRatio(j))];case 0tPos=meanPos;obj.posSet=[obj.posSet;tPos(1)+tPos(3)*tClassPartRatio(j),tPos(2),...tPos(3)*(tClassPartRatio(j+1)-tClassPartRatio(j)),tPos(4)];endendmeanPos=compPos;typeInd=mod(typeInd+1,2);tClassRatio(1:p5Index)=[];if isempty(tClassRatio),break;endtClassRatio=tClassRatio./sum(tClassRatio);tCumClassRatio=cumsum(tClassRatio);end% =============================================================% 计算各类矩形树位置for n=1:obj.classNum% drawSquare(obj.posSet(n,:),obj.ColorOrder(n,:));tRatio=obj.Data(obj.classSet(n)==obj.Class); tRatio=tRatio(:).';tRatio=tRatio./sum(tRatio);[~,tind]=sort(tRatio,'descend');tRatio=tRatio(tind);obj.CS(n).R=tRatio;obj.CS(n).P=zeros(0,4);obj.CS(n).S=obj.Name(obj.classSet(n)==obj.Class); obj.CS(n).S=obj.CS(n).S(tind);tCumRatio=cumsum(tRatio);meanPos=obj.posSet(n,:);typeInd=1;% ---------------------------------------------------------for i=1:length(tRatio)p5Index=find(tCumRatio>.5,1);switch(typeInd)case 1tPos=meanPos;meanPos=tPos;compPos=tPos;meanPos(3)=tPos(3).*tCumRatio(p5Index);compPos(1)=tPos(1)+tPos(3).*tCumRatio(p5Index);compPos(3)=tPos(3).*(1-tCumRatio(p5Index));case 0tPos=meanPos;meanPos=tPos;compPos=tPos;meanPos(4)=tPos(4).*tCumRatio(p5Index);compPos(2)=tPos(2)+tPos(4).*tCumRatio(p5Index);compPos(4)=tPos(4).*(1-tCumRatio(p5Index));endtPartRatio=tCumRatio(1:p5Index);tPartRatio=[0,tPartRatio./max(tPartRatio)];for j=1:p5Indexswitch(typeInd)case 1tPos=meanPos;obj.CS(n).P=[obj.CS(n).P;tPos(1),tPos(2)+tPos(4)*tPartRatio(j),...tPos(3),tPos(4)*(tPartRatio(j+1)-tPartRatio(j))];case 0tPos=meanPos;obj.CS(n).P=[obj.CS(n).P;tPos(1)+tPos(3)*tPartRatio(j),tPos(2),...tPos(3)*(tPartRatio(j+1)-tPartRatio(j)),tPos(4)];endendmeanPos=compPos;typeInd=mod(typeInd+1,2);tRatio(1:p5Index)=[];if isempty(tRatio),break;endtRatio=tRatio./sum(tRatio);tCumRatio=cumsum(tRatio);end% ---------------------------------------------------------end% =============================================================% 绘制矩形树状图for n=1:obj.classNumfor i=1:size(obj.CS(n).P,1)obj.hdlSet(n).P(i)=drawSquare(obj.CS(n).P(i,:),obj.ColorOrder(n,:),obj.CS(n).R(i)./max(obj.CS(n).R).*.3+.5);endendfor n=1:obj.classNumif mean(obj.ColorOrder(n,:))>.5tColor=[.3,.3,.3];elsetColor=[1,1,1];endfor i=1:size(obj.CS(n).P,1)if obj.CS(n).R(i)>1e-2&&isempty(obj.CS(n).S{i})obj.hdlSet(n).T(i)=text(obj.CS(n).P(i,1),obj.CS(n).P(i,2),...[sprintf('%.2f',obj.CS(n).R(i)*100),'%'],'VerticalAlignment','bottom','Color',tColor);elseif ~isempty(obj.CS(n).S{i})obj.hdlSet(n).T(i)=text(obj.CS(n).P(i,1),obj.CS(n).P(i,2),...obj.CS(n).S{i},'VerticalAlignment','bottom','Color',tColor);endendendfor n=1:obj.classNumobj.hdlSet(n).C=text(obj.posSet(n,1)+obj.posSet(n,3)/2,...obj.posSet(n,2)+obj.posSet(n,4)/2,...obj.ClassName{n},'FontSize',16,'FontWeight','bold',...'HorizontalAlignment','center');endfunction sqHdl=drawSquare(pos,color,alpha)sqHdl=fill([pos(1),pos(1)+pos(3),pos(1)+pos(3),pos(1)],...[pos(2),pos(2),pos(2)+pos(4),pos(2)+pos(4)],color,...'EdgeColor','k','FaceAlpha',alpha,'LineWidth',1);endend% =================================================================function setColor(obj,N,color)for n=find(obj.index==N)if mean(color)>.5tColor=[.3,.3,.3];elsetColor=[1,1,1];endfor i=1:length(obj.hdlSet(n).P)set(obj.hdlSet(n).P(i),'FaceColor',color)endfor i=1:length(obj.hdlSet(n).T)set(obj.hdlSet(n).T(i),'Color',tColor)endendendfunction setPatch(obj,varargin)for n=1:obj.classNumfor i=1:length(obj.hdlSet(n).P)set(obj.hdlSet(n).P(i),varargin{:})endendendfunction setFont(obj,varargin)for n=1:obj.classNumfor i=1:length(obj.hdlSet(n).T)set(obj.hdlSet(n).T(i),varargin{:})endendendfunction setLabel(obj,varargin)for n=1:obj.classNumset(obj.hdlSet(n).C,varargin{:})endendend
% @author : slandarer
% gzh : slandarer随笔 % Zhaoxu Liu (2022). Rectangular Tree 矩形树状图
% (https://www.mathworks.com/matlabcentral/fileexchange/118515-rectangular-tree),
% MATLAB Central File Exchange. 检索来源 2022/10/3.
end

MATLAB矩形树状图绘制能画成这样属实不易,如果有用请留个叭~

未经允许本代码请勿作商业用途,引用的话可以引用我file exchange上的链接,可使用如下格式:

Zhaoxu Liu (2022). Rectangular Tree 矩形树状图 (https://www.mathworks.com/matlabcentral/fileexchange/118515-rectangular-tree), MATLAB Central File Exchange. 检索来源 2022/10/3.

若转载请保留以上file exchange链接及本文链接!!!

全部m文件及数据获取:
链接:https://pan.baidu.com/s/1gGF1T4AD0WKNP487tnMq6A?pwd=slan
提取码:slan

MATLAB | 全网唯一,使用MATLAB绘制矩形树状图相关推荐

  1. R语言绘制矩形树状图

    #------------------------------------------------图7-3-2 树状图(a)-------------------------------------- ...

  2. Origin Pro绘制聚类分析树状图

    工作环境(蓝色粗体字为特别注意内容) 1.软件环境:Windows 7 Ultimate sp1.MatlabR2012b 32bit.OriginPro 2018C. 一般来说,Origin Pro ...

  3. R语言绘制环形树状图

    R语言绘制环形树状图 1.主要用到dendextend和circlize包绘图: library(dendextend) library(circlize)# 距离矩阵 d <- dist(US ...

  4. MATLAB | 全网唯一,使用MATLAB绘制精致的环形树状图

    绘制效果 请叫我平平无奇的绘图天才,这期一次性带来俩工具函数,分别是两层和三层的环形树状图,可以用来展示数据分类和层级: 理顺层级关系属实理得头秃,代码编写不易点个赞叭!! 由于工具函数过长,将被放在 ...

  5. Matlab绘制聚类分析树状图

    工作环境(蓝色粗体字为特别注意内容) 1.软件环境:Windows 7 Ultimate sp1.MatlabR2012b 32bit. 在使用Matlab做聚类分析的时候一般这样用: Y = pdi ...

  6. 可视化神器Plotly绘制树状图

    大家好,我是Peter~ 今天给大家带来的是一篇关于Plotly绘图的文章:如何使用Plotly来绘制矩形树状图 Plotly文章 目前Plotly的文章更新到第17篇,推荐几篇文章: 闲聊 为什么P ...

  7. MATLAB | 绘图复刻(三) | 分层聚类分析图:树状图+热图

    好久不见啊,今天时绘图复刻第三期,这期画的比较难应该文章也不会太短... 前段时间发现公众号SCIPainter发布了一期名为<如何对基因和蛋白质的表达丰度进行相关性分析>,其中有一幅图很 ...

  8. R语言绘图—多边树状图

    先安装voronoiTreemap包,安装好了就见下面的内容吧!) 一.函数用法 绘制圆形树状图的函数为vt_d3,函数用法如下: vt_d3(data, elementId = NULL, widt ...

  9. R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放、hclust包层次聚类(创建距离矩阵、聚类、绘制树状图dendrogram,在树状图上绘制红色矩形框)

    R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放.hclust包层次聚类(创建距离矩阵.聚类.绘制树状图dendrogram,在树状图上绘制红色矩形框) ...

最新文章

  1. 英语语法---短语总结
  2. H - Prince and Princess 计蒜客 - 42402
  3. VC++调试win32设置参数
  4. 实现原理 扫描枪_条码扫描枪工作原理
  5. 疫情之下的“催化剂”:在线经济崛起 房产数字化变革加速
  6. kafka入门(一)简介
  7. 使用java语言实现将10进制转化为2进制
  8. 2020你一直在苦找的Ps插件全在这!20款Photoshop实用插件分享
  9. R语言聚类分析-kmeans聚类分析实战
  10. 微分方程建模——以传染病模型为例
  11. fps类游戏c语言源程序,95k的FPS游戏!用C++和汇编编写
  12. 弘辽科技:如何快速提高淘宝店铺的综合评分
  13. RAW数据格式的图片转换--常用于相机开发和图片旋转
  14. 腾达ac1200开虚拟服务器,腾达F1200 11AC双频无线路由器的上网设置教程
  15. 在报表开发工具Stimulsoft Report数据透视表的新功能介绍
  16. 【genius_platform软件平台开发】第九十三讲:串口通信(485通信)
  17. lncRNASNP:SNP位点对lncNA结构和lncRNA-miRNA影响的数据库
  18. 华为员工自曝百万级年终奖,论坛征女友!
  19. 工业机器人智能制造生产线教学案例
  20. 朋友圈里这3种人,一定要远离

热门文章

  1. 开学都需要什么新装备、建议学生们看看这份好物清单
  2. python静态方法、实例方法、类方法使用
  3. 【Win10】Win10 系统如何打开/关闭护眼模式
  4. Python画动漫人物(2)
  5. mask rcnn算法原理图_Mask_RCNN官方示例算法测试
  6. python 二维码生成与识别
  7. Navicat ODBC驱动器管理器:未发现数据源名称并且未指定默认驱动程序
  8. 传说她是海洋大学校花
  9. 数据库的数据导入与导出
  10. 编程之美-02数字之魅-求二进制数中1的个数