文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于Matlab实现山脊图的绘制

2024-04-02 19:55

关注

写了一个用于绘制山脊图的模板,仅需要往需要填写数据的区域填入数据点击运行即可,以下提供两款模板,第一款为纯色模板而第二款为渐变色模板:

纯色山脊图模板

模板代码:

function ridgeMapTMPL1
% @author: slandarer

% 在这里放入你的数据=======================================================
X1=normrnd(2,2,1,1000);
X2=[normrnd(4,4,1,1000),normrnd(5,2,1,200)];
X3=[normrnd(2.5,2,1,1000),normrnd(6,4,1,200)];
X4=[normrnd(1,1,1,300),normrnd(2,4,1,200)];
X5=[normrnd(4,2,1,300),normrnd(2,4,1,600)];

% 把数据放到元胞数组,要是数据太多可写循环放入
dataCell={X1,X2,X3,X4,X5};    

% 各个数据类的名称,可空着
dataName={'A','B','C','D','E'};

% 各个山脊的颜色,可空着也可只放一个颜色
colorList=[];                  

% 非必要属性
% -------------------------------------------------------------------------
legendOn=false;  % 是否绘制图例 true/false
xTickOn=true;    % 开启X轴

sep=1/6;         % 设置山脊距离,可空着
xLim=[];         % 设置X轴范围距离,可空着
axColor=[];      % 设置背景颜色,可空着
fontName='';     % 设置X,Y轴标签字体,可空着
fontSize=14;     % 设置X,Y轴标签字号,可空着
faceAlpha=1;           % 面透明度
edgeColor=[1,1,1].*.3; % 边缘颜色
% =========================================================================

% 设置颜色
classNum=length(dataCell);
if size(colorList,1)==0
    colorList=repmat([130,170,172]./255,[classNum,1]);
else
    colorList=repmat(colorList,[ceil(classNum/size(colorList,1)),1]);
end

% 设置间隙距离
if isempty(sep)
sep=1/6;
end

hold on
ax=gca;
ax.YGrid='on';
ax.YLim=[0,sep*classNum+sep/2];
ax.YTick=0:sep:sep*(classNum-1);
ax.YColor='none';
ax.LineWidth=1.2;
% ax.YTickLabel=dataName;
if isempty(fontName),fontName='Helvetica';end
if isempty(fontSize),fontSize=14;end
ax.FontName=fontName;
ax.FontSize=fontSize;
if ~xTickOn,ax.XColor='none';end
if ~isempty(xLim),ax.XLim=xLim;end
if ~isempty(axColor),ax.Color=axColor;end
if isempty(dataName)
    for i=1:classNum
        dataName{i}=num2str(i);
    end
end

% 绘制山脊
for i=1:classNum
    tX=dataCell{i};tX=tX(:);
    [F,Xi]=ksdensity(tX);
    patchCell(i)=fill([Xi(1),Xi,Xi(end)],[0,F,0]+(sep).*(classNum-i).*ones(1,length(F)+2),...
        colorList(i,:),'EdgeColor','none','FaceAlpha',faceAlpha);
    plot([Xi(1),Xi,Xi(end)],[0,F,0]+(sep).*(classNum-i).*ones(1,length(F)+2),...
        'Color',edgeColor,'LineWidth',1.2)
end

% 绘制图例
if legendOn
legend(patchCell,dataName)
end

% 绘制字符
ax.UserData.classNum=classNum;
ax.UserData.sep=sep;
for k=1:classNum
    ax.UserData.(['t',num2str(k)])=text(ax.XLim(1),(sep).*(classNum-k),[dataName{k},' '],...
        'FontSize',fontSize,'FontName',fontName,'HorizontalAlignment','right','VerticalAlignment','bottom');
end
    function reTXT(~,~)
        for kk=1:ax.UserData.classNum
            ax.UserData.(['t',num2str(kk)]).Position=...
                [ax.XLim(1),(ax.UserData.sep).*(ax.UserData.classNum-kk),0];
        end
    end

set(ax.Parent,'WindowButtonMotionFcn',@reTXT); 
% 额外的属性设置===========================================================
% ax.(...)=...

% =========================================================================
end

绘制效果:

更该部分配置后的绘制效果:

将每个山脊赋予不同颜色,删除X轴并添加图例

% 在这里放入你的数据=======================================================
X1=normrnd(2,2,1,1000);
X2=[normrnd(4,4,1,1000),normrnd(5,2,1,200)];
X3=[normrnd(2.5,2,1,1000),normrnd(6,4,1,200)];
X4=[normrnd(1,1,1,300),normrnd(2,4,1,200)];
X5=[normrnd(4,2,1,300),normrnd(2,4,1,600)];

% 把数据放到元胞数组,要是数据太多可写循环放入
dataCell={X1,X2,X3,X4,X5};    

% 各个数据类的名称,可空着
dataName={'A','B','C','D','E'};

% 各个山脊的颜色,可空着也可只放一个颜色
colorList=[0.98,0.70,0.95
0.69,0.81,1.00
0.50,0.88,0.89
0.50,0.87,0.61
0.86,0.82,0.50];                  

% 非必要属性
% -------------------------------------------------------------------------
legendOn=true;  % 是否绘制图例 true/false
xTickOn=false;   % 开启X轴

sep=1/6;         % 设置山脊距离,可空着
xLim=[];         % 设置X轴范围距离,可空着
axColor=[];      % 设置背景颜色,可空着
fontName=[];     % 设置X,Y轴标签字体,可空着
fontSize=14;     % 设置X,Y轴标签字号,可空着
faceAlpha=1;           % 面透明度
edgeColor=[1,1,1].*.3; % 边缘颜色
% ===============================================================

渐变色山脊图模板

模板代码:

function ridgeMapTMPL2
% @author: slandarer

% 在这里放入你的数据=======================================================
X1=normrnd(2,2,1,1000);
X2=[normrnd(4,4,1,1000),normrnd(5,2,1,200)];
X3=[normrnd(2.5,2,1,1000),normrnd(6,4,1,200)];
X4=[normrnd(1,1,1,300),normrnd(2,4,1,200)];
X5=[normrnd(4,2,1,300),normrnd(2,4,1,600)];

% 把数据放到元胞数组,要是数据太多可写循环放入
dataCell={X1,X2,X3,X4,X5};    

% 各个数据类的名称,可空着
dataName={'A','B','C','D','E'};

% 山脊的渐变颜色,可空着也放数组也可放颜色名称
cmap=[];
% cmap=PYCM().plasma();   
% cmap='colorcube'

% 非必要属性
% -------------------------------------------------------------------------
xTickOn=true;    % 开启X轴

sep=1/6;         % 设置山脊距离,可空着
xLim=[];         % 设置X轴范围距离,可空着
fontName='';     % 设置X,Y轴标签字体,可空着
fontSize=14;     % 设置X,Y轴标签字号,可空着
% =========================================================================


classNum=length(dataCell);

% 设置间隙距离
if isempty(sep)
sep=1/6;
end

hold on
ax=gca;
ax.YGrid='on';
ax.YLim=[0,sep*classNum+sep/2];
ax.YTick=0:sep:sep*(classNum-1);
ax.YColor='none';
ax.LineWidth=1.2;
% ax.YTickLabel=dataName;
if isempty(fontName),fontName='Helvetica';end
if isempty(fontSize),fontSize=14;end

ax.FontName=fontName;
ax.FontSize=fontSize;
if ~xTickOn,ax.XColor='none';end
if ~isempty(xLim),ax.XLim=xLim;end
if isempty(dataName)
    for i=1:classNum
        dataName{i}=num2str(i);
    end
end

% 绘制山脊
for i=1:classNum
    tX=dataCell{i};tX=tX(:);
    [F,Xi]=ksdensity(tX);
    patchCell(i)=patch([Xi(1),Xi,Xi(end)],[0,F,0]+(sep).*(classNum-i).*ones(1,length(F)+2),...
        [Xi(1),Xi,Xi(end)],'FaceColor','interp','EdgeColor','none');
    plot([Xi(1),Xi,Xi(end)],[0,F,0]+(sep).*(classNum-i).*ones(1,length(F)+2),...
        'Color',[.3,.3,.3],'LineWidth',1.2)
end
if isempty(cmap)
colormap()
else
colormap(cmap)
end

% 绘制字符
ax.UserData.classNum=classNum;
ax.UserData.sep=sep;
for k=1:classNum
    ax.UserData.(['t',num2str(k)])=text(ax.XLim(1),(sep).*(classNum-k),[dataName{k},' '],...
        'FontSize',fontSize,'FontName',fontName,'HorizontalAlignment','right','VerticalAlignment','bottom');
end
    function reTXT(~,~)
        for kk=1:ax.UserData.classNum
            ax.UserData.(['t',num2str(kk)]).Position=...
                [ax.XLim(1),(ax.UserData.sep).*(ax.UserData.classNum-kk),0];
        end
    end

set(ax.Parent,'WindowButtonMotionFcn',@reTXT); 
% 额外的属性设置===========================================================
% ax.(...)=...

% =========================================================================
end

绘制效果:

使用MATLAB自带颜色:

例:将cmap=[]改为:

cmap='summer'

cmap='colorcube'

使用PYCM函数:

例:将cmap=[]改为:

cmap=PYCM().plasma()

到此这篇关于基于Matlab实现山脊图的绘制的文章就介绍到这了,更多相关Matlab山脊图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯