classdef chordChart
%
% 使用示例:
% =========================================================================
% dataMat=[2 0 1 2 5 1 2;
% 3 5 1 4 2 0 1;
% 4 0 5 5 2 4 3];
% colName={'G1','G2','G3','G4','G5','G6','G7'};
% rowName={'S1','S2','S3'};
%
% CC=chordChart(dataMat,'rowName',rowName,'colName',colName);
% CC=CC.draw()
properties
ax
arginList={'colName','rowName','Sep'}
verMatlab % MATLAB 版本: R2021a显示为2021,R2021b显示为2021.5
chordTable % table数组
dataMat % 数值矩阵
colName={}; % 列名称
rowName={}; % 行名称
thetaSetF
thetaSetT
% -----------------------------------------------------------
squareFHdl % 绘制下方方块的图形对象矩阵
squareTHdl % 绘制下上方方块的图形对象矩阵
nameFHdl % 绘制下方文本的图形对象矩阵
nameTHdl % 绘制上方文本的图形对象矩阵
chordMatHdl % 绘制弦的图形对象矩阵
thetaTickFHdl % 刻度句柄
thetaTickTHdl % 刻度句柄
RTickFHdl % 轴线句柄
RTickTHdl % 轴线句柄
Sep
end
methods
function obj=chordChart(varargin)
if isa(varargin{1},'matlab.graphics.axis.Axes')
obj.ax=varargin{1};varargin(1)=[];
else
obj.ax=gca;
end
% 获取版本信息
tver=version('-release');
obj.verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;
if obj.verMatlab<2017
hold on
else
hold(obj.ax,'on')
end
obj.dataMat=varargin{1};varargin(1)=[];
if isa(obj.dataMat,'table')
obj.chordTable=obj.dataMat;
if isempty(obj.chordTable.Properties.RowNames)
for i=1:size(obj.chordTable.Variables,1)
obj.rowName{i}=['R',num2str(i)];
end
end
else
obj.Sep=1/40;
% 获取其他数据
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
tzerocell{1,size(obj.dataMat,2)}=zeros(size(obj.dataMat,1),1);
for i=1:size(obj.dataMat,2)
tzerocell{1,i}=zeros(size(obj.dataMat,1),1);
end
if isempty(obj.colName)
for i=1:size(obj.dataMat,2)
obj.colName{i}=['C',num2str(i)];
end
end
if isempty(obj.rowName)
for i=1:size(obj.dataMat,1)
obj.rowName{i}=['R',num2str(i)];
end
end
if obj.Sep>1/40
obj.Sep=1/40;
end
% 创建table数组
obj.chordTable=table(tzerocell{:});
obj.chordTable.Variables=obj.dataMat;
obj.chordTable.Properties.VariableNames=obj.colName;
obj.chordTable.Properties.RowNames=obj.rowName;
help chordChart
end
end
function obj=draw(obj)
obj.ax.XLim=[-1.38,1.38];
obj.ax.YLim=[-1.38,1.38];
obj.ax.XTick=[];
obj.ax.YTick=[];
obj.ax.XColor='none';
obj.ax.YColor='none';
obj.ax.PlotBoxAspectRatio=[1,1,1];
% 计算绘图所用数值
tDMat=obj.chordTable.Variables;
tDFrom=obj.chordTable.Properties.RowNames;
tDTo=obj.chordTable.Properties.VariableNames;
tDMatUni=tDMat-min(min(tDMat));
tDMatUni=tDMatUni./max(max(tDMatUni));
sep1=1/20;
sep2=obj.Sep;
ratioF=sum(tDMat,2)./sum(sum(tDMat));
ratioF=[0,ratioF'];
ratioT=[0,sum(tDMat,1)./sum(sum(tDMat))];
sepNumF=size(tDMat,1);
sepNumT=size(tDMat,2);
sepLen=pi*(1-2*sep1)*sep2;
baseLenF=(pi*(1-sep1)-(sepNumF-1)*sepLen);
baseLenT=(pi*(1-sep1)-(sepNumT-1)*sepLen);
tColor=[61 96 137;76 103 86]./255;
% 绘制下方方块
for i=1:sepNumF
theta1=2*pi-pi*sep1/2-sum(ratioF(1:i))*baseLenF-(i-1)*sepLen;
theta2=2*pi-pi*sep1/2-sum(ratioF(1:i+1))*baseLenF-(i-1)*sepLen;
theta=linspace(theta1,theta2,100);
X=cos(theta);Y=sin(theta);
obj.squareFHdl(i)=fill([1.05.*X,1.15.*X(end:-1:1)],[1.05.*Y,1.15.*Y(end:-1:1)],...
tColor(1,:),'EdgeColor','none');
theta3=(theta1+theta2)/2;
obj.nameFHdl(i)=text(cos(theta3).*1.28,sin(theta3).*1.28,tDFrom{i},'FontSize',12,'FontName','Arial',...
'HorizontalAlignment','center','Rotation',-(1.5*pi-theta3)./pi.*180);
obj.RTickFHdl(i)=plot(cos(theta).*1.17,sin(theta).*1.17,'Color',[0,0,0],'LineWidth',.8,'Visible','off');
end
% 绘制上方放块
for j=1:sepNumT
theta1=pi-pi*sep1/2-sum(ratioT(1:j))*baseLenT-(j-1)*sepLen;
theta2=pi-pi*sep1/2-sum(ratioT(1:j+1))*baseLenT-(j-1)*sepLen;
theta=linspace(theta1,theta2,100);
X=cos(theta);Y=sin(theta);
obj.squareTHdl(j)=fill([1.05.*X,1.15.*X(end:-1:1)],[1.05.*Y,1.15.*Y(end:-1:1)],...
tColor(2,:),'EdgeColor','none');
theta3=(theta1+theta2)/2;
obj.nameTHdl(j)=text(cos(theta3).*1.28,sin(theta3).*1.28,tDTo{j},'FontSize',12,'FontName','Arial',...
'HorizontalAlignment','center','Rotation',-(.5*pi-theta3)./pi.*180);
obj.RTickTHdl(j)=plot(cos(theta).*1.17,sin(theta).*1.17,'Color',[0,0,0],'LineWidth',.8,'Visible','off');
end
colorFunc=colorFuncFactory(flipud(summer(50)));
% 绘制弦
for i=1:sepNumF
for j=sepNumT:-1:1
theta1=2*pi-pi*sep1/2-sum(ratioF(1:i))*baseLenF-(i-1)*sepLen;
theta2=2*pi-pi*sep1/2-sum(ratioF(1:i+1))*baseLenF-(i-1)*sepLen;
theta3=pi-pi*sep1/2-sum(ratioT(1:j))*baseLenT-(j-1)*sepLen;
theta4=pi-pi*sep1/2-sum(ratioT(1:j+1))*baseLenT-(j-1)*sepLen;
tRowV=tDMat(i,:);tRowV=[0,tRowV(end:-1:1)./sum(tRowV)];
tColV=tDMat(:,j)';tColV=[0,tColV./sum(tColV)];
% 贝塞尔曲线断点计算
theta5=(theta2-theta1).*sum(tRowV(1:(sepNumT+1-j)))+theta1;
theta6=(theta2-theta1).*sum(tRowV(1:(sepNumT+2-j)))+theta1;
theta7=(theta3-theta4).*sum(tColV(1:i))+theta4;
theta8=(theta3-theta4).*sum(tColV(1:i+1))+theta4;
tPnt1=[cos(theta5),sin(theta5)];
tPnt2=[cos(theta6),sin(theta6)];
tPnt3=[cos(theta7),sin(theta7)];
tPnt4=[cos(theta8),sin(theta8)];
if j==sepNumT,obj.thetaSetF(i,1)=theta5;end
obj.thetaSetF(i,j+1)=theta6;
if i==1,obj.thetaSetT(1,j)=theta7;end
obj.thetaSetT(i+1,j)=theta8;
% 计算曲线
tLine1=bezierCurve([tPnt1;0,0;tPnt3],200);
tLine2=bezierCurve([tPnt2;0,0;tPnt4],200);
tline3=[cos(linspace(theta6,theta5,100))',sin(linspace(theta6,theta5,100))'];
tline4=[cos(linspace(theta7,theta8,100))',sin(linspace(theta7,theta8,100))'];
没有合适的资源?快使用搜索试试~ 我知道了~
基于Matlab绘图复刻和弦图+颜色修改+标签旋转(源码+图片).rar
共15个文件
png:8个
m:5个
jpg:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 102 浏览量
2023-04-12
16:15:28
上传
评论
收藏 2.67MB RAR 举报
温馨提示
1、资源内容:基于Matlab绘图复刻和弦图+颜色修改+标签旋转(源码+图片).rar 2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。 3、更多仿真源码和数据集下载列表(自行寻找自己需要的):https://blog.csdn.net/m0_62143653?type=download 4、免责声明:本资源作为“参考资料”而不是“定制需求”不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。
资源推荐
资源详情
资源评论
收起资源包目录
基于Matlab绘图复刻和弦图+颜色修改+标签旋转(源码+图片).rar (15个子文件)
基于Matlab绘图复刻和弦图+颜色修改+标签旋转(源码+图片)
p7.png 328KB
p8.png 353KB
p5.png 319KB
chordDemo.m 2KB
demo1.m 354B
p1.png 295KB
640 (1).jpg 131KB
p2.png 299KB
p4.png 319KB
p6.png 320KB
demo3.m 1KB
chordChart.m 13KB
p3.png 318KB
640.jpg 98KB
demo2.m 1008B
共 15 条
- 1
资源评论
Matlab仿真实验室
- 粉丝: 2w+
- 资源: 2180
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Easy Save - 3.5.6
- 基于tensorflow的目标检测系统源码+部署教程文档+全部数据+训练好的模型(高分项目)
- 基于Python皮肤电信号的情绪识别算法源码+模型+PPT+详细文档+全部数据资料.zip
- 基于Python皮肤电信号的情绪识别算法源码+模型+PPT+详细文档+全部数据资料.zip
- 区块链毕业设计 基于区块链的慈善募捐平台的智能合约源码+详细文档+全部资料(高分项目).zip
- 区块链毕业设计 基于区块链的慈善募捐平台的智能合约源码+详细文档+全部资料(高分项目).zip
- 区块链毕业设计 基于区块链的慈善募捐平台的智能合约源码+详细文档+全部资料(高分项目).zip
- 免费听歌软件,支持无损音乐下载,支持收藏音乐同步
- 锐起RDV-5.0 build 6503
- ngrok-stable-windows-amd64.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功