MATLAB | 如何用MATLAB绘制花里胡哨的山脊图
创始人
2024-06-03 15:36:43
0

本期推送教大家如何绘制各种样式的山脊图,这里做了一个工具函数用来实现好看的山脊图的绘制,编写不易请多多点赞,大体绘制效果如下:

依旧工具函数放在文末。


教程部分

0 数据准备

数据为多个一维向量放在元胞数组中,大概像这样:

X1=normrnd(2,2,1,50);
X2=[normrnd(4,4,1,50),normrnd(5,2,1,50)];
X3=[normrnd(6,2,1,50),normrnd(8,4,1,50)];
X4=[normrnd(12,1,1,50),normrnd(12,4,1,50)];
X5=[normrnd(10,2,1,50),normrnd(10,4,1,50)];
X6=[normrnd(7,2,1,50),normrnd(7,4,1,50)];
X7=[normrnd(4,2,1,50),normrnd(4,4,1,50)];Data={X1,X2,X3,X4,X5,X6,X7};

1 基础绘制:上色类型

通过设置ColorMode属性设置上色方式,可设置为:

  • Order
  • X
  • GlobalX
  • Kdensity
  • Qt

Order:每个山脊不同颜色

JP=joyPlot(Data,'ColorMode','Order');
JP=JP.draw();

绘制并添加图例(同时可以通过MedLine设置显示中位线):

JP=joyPlot(Data,'ColorMode','Order','MedLine','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

可以通过设置ColorList属性或者使用setPatchColor函数设置颜色,推荐前者:

ColorList属性设置颜色:

newColorList=[0.1059    0.6196    0.46670.8510    0.3725    0.00780.4588    0.4392    0.70200.6529    0.4059    0.32940.9020    0.6706    0.00780.6510    0.4627    0.11370.4000    0.4000    0.4000];
JP=joyPlot(Data,'ColorMode','Order','ColorList',newColorList);
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

setPatchColor函数设置颜色,只能设置面颜色设置不了线条颜色:

JP=joyPlot(Data,'ColorMode','Order');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)% 设置山脊颜色
newColorList=[0.1059    0.6196    0.46670.8510    0.3725    0.00780.4588    0.4392    0.70200.6529    0.4059    0.32940.9020    0.6706    0.00780.6510    0.4627    0.11370.4000    0.4000    0.4000];
JP=JP.setPatchColor(newColorList)

当然可以全部设置为同一颜色:

JP=joyPlot(Data,'ColorMode','Order','ColorList',[0,0,.6]);
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl(1))

X 每个山脊分别把X映射为颜色

JP=joyPlot(Data,'ColorMode','X','MedLine','on');
JP=JP.draw();

当然可以添加colorbar:

colorbar()

设置为其他颜色:

JP=JP.setPatchColor(winter);

JP=JP.setPatchColor(colorcube(256));

GlobalX 全局性把X坐标映射为颜色

Data={X1,X2,X3,X4,X5,X6,X7};
JP=joyPlot(Data,'ColorMode','GlobalX','MedLine','on');
JP=JP.draw();colorbar 

换成别的颜色:

JP=JP.setPatchColor(colorcube(256));

Kdensity 依靠核密度

Data={X1,X2,X3,X4,X5,X6,X7};
JP=joyPlot(Data,'ColorMode','Kdensity','MedLine','on');
JP=JP.draw();colorbar 

换成别的颜色:

JP=JP.setPatchColor(turbo);

Qt 分位染色

默认是0.25,0.75分位染色:

JP=joyPlot(Data,'ColorMode','Qt','MedLine','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

修改分位线(通过设置Quantiles属性):

JP=joyPlot(Data,'ColorMode','Qt','MedLine','on','Quantiles',[.1,.9]);
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

绘制分位线(可将QtLine设置为on):

JP=joyPlot(Data,'ColorMode','Qt','MedLine','on','Quantiles',[.1,.9],'QtLine','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

值得一提的是,所有染色方式都可以绘制QtLine分位线:

JP=joyPlot(Data,'ColorMode','Order','MedLine','on','Quantiles',[.1,.9],'QtLine','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)


更多分位线和更丰富配色:

JP=joyPlot(Data,'ColorMode','Qt','MedLine','on','Quantiles',[.1,.25,.75,.9],'ColorList',turbo(5),'QtLine','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl,{'0~0.1','0.1~0.25','0.25~0.75','0.75~0.9','0.9~1'})

更改配色:

JP=JP.setPatchColor(bone(6));

2 山脊图间距

通过设置Sep属性设置间距,例如小间距:

JP=joyPlot(Data,'ColorMode','Kdensity','Sep',1/30);
JP=JP.draw();colorbar

间距设置为1/60:

设置大间距(1/3):

3 绘制线状散点

只有Order类型配色不是黑色:

JP=joyPlot(Data,'ColorMode','Order','Scatter','on');
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl

Data={X1,X2,X3,X4,X5,X6,X7};
JP=joyPlot(Data,'ColorMode','GlobalX','MedLine','on','Scatter','on');
JP=JP.draw();colorbar 

4 属性单独设置

每个玩意的属性都可以单独设置
例如:

  • setRidgePatch 设置山脊面
  • setRidgeLine 设置山脊边缘线
  • setMedLine 设置中位线
  • setQtLine 设置分位线
  • setScatter 设置散点
JP=joyPlot(Data,'ColorMode','Order','Scatter','on','QtLine','on','MedLine','on','Sep',1/5);
JP=JP.draw();legendHdl=JP.getLegendHdl();
legend(legendHdl)

设置第3个山脊颜色和透明度:

JP.setRidgePatch(3,'FaceColor',[0,0,0],'FaceAlpha',.5)

循环改变所有的颜色和透明度:

for i=1:length(Data)JP.setRidgePatch(i,'FaceColor',[1,1,1]./length(Data).*i,'FaceAlpha',.5)
end

其他玩意也都类似!

for i=1:length(Data)JP.setRidgePatch(i,'FaceColor',[1,1,1]./length(Data).*i,'FaceAlpha',.5)JP.setRidgeLine(i,'Color',[0,0,.8],'LineWidth',1)JP.setScatter(i,'Color',[0,0,0,.4])JP.setMedLine(i,'Color',[0,0,.8])JP.setQtLine(i,'Color',[0,0,.8])
end

5 多组数据绘图

举个例子:

X1_1=normrnd(-15,2,1,20);
X1_2=[normrnd(4,4,1,10),normrnd(5,2,1,10)];
X1_3=[normrnd(6,2,1,10),normrnd(8,4,1,10)];
X1_4=[normrnd(12,1,1,10),normrnd(12,4,1,10)];
X1_5=[normrnd(-7,2,1,10),normrnd(2,4,1,10)];
X1_6=[normrnd(-7,2,1,10),normrnd(-7,4,1,10)];
Data1={X1_1,X1_2,X1_3,X1_4,X1_5,X1_6};
X2_1=normrnd(-8,2,1,20);
X2_2=[normrnd(2,4,1,10),normrnd(2,2,1,10)];
X2_3=[normrnd(18,2,1,10),normrnd(18,4,1,10)];
X2_4=[normrnd(18,1,1,10),normrnd(18,4,1,10)];
X2_5=[normrnd(5,2,1,10),normrnd(5,4,1,10)];
X2_6=[normrnd(-20,2,1,10),normrnd(-20,4,1,10)];
Data2={X2_1,X2_2,X2_3,X2_4,X2_5,X2_6};JP1=joyPlot(Data1,'ColorMode','Order','ColorList',[12,165,154]./255,'MedLine','on','Scatter','on');
JP1=JP1.draw();JP2=joyPlot(Data2,'ColorMode','Order','ColorList',[151,220,71]./255,'MedLine','on','Scatter','on');
JP2=JP2.draw();% 设置中位线颜色
for i=1:length(Data1)JP1.setMedLine(i,'Color',[12,165,154]./255)
end
for i=1:length(Data2)JP2.setMedLine(i,'Color',[151,220,71]./255)
end% 绘制图例
legendHdl1=JP1.getLegendHdl();
legendHdl2=JP2.getLegendHdl();
legend([legendHdl1(1),legendHdl2(1)],{'AAAAA','BBBBB'})


工具函数完整代码

classdef joyPlot
% @author : slandarer
% gzh     : slandarer随笔 
% Zhaoxu Liu / slandarer (2023). joyplot 
% (https://www.mathworks.com/matlabcentral/fileexchange/125255-joyplot), 
% MATLAB Central File Exchange. 检索来源 2023/2/23.
%
%
% =========================================================================
% 1.0 版本创建记录                                          ——————2023.02.23
% 1.0.0 Update1 设置 'Order'/'X'/'GlobalX'/'Kdensity'/'Qt'5种渲染模式(ColorMode)
% 1.0.0 Update2 设置 中位线(MedLine)、分位线(QtLine)、竖线散点(Scatter)
% 1.0.0 Update3 设置 Seq函数以调整山脊间隙
% 1.0.0 Update4 设置 各个组件修饰函数:
%           + setRidgePatch(obj,n,varargin)
%           + setRidgeLine(obj,n,varargin)
%           + setMedLine(obj,n,varargin)
%           + setQtLine(obj,n,varargin)
%           + setScatter(obj,n,varargin)
% 1.0.0 Update5 使用 try...Catch结构较为摆烂的解决clim及caxis的版本问题
% -------------------------------------------------------------------------
% 1.5.0 版本更新记录                                          ——————2023.02.24
% 1.5.0 Update1 使用surf函数代替fill函数解决小区间竖直方向占比过大渲染错误问题
% 1.5.0 Update2 同步更新setPatchColor函数颜色修改代码
% -------------------------------------------------------------------------propertiesax,arginList={'ColorMode','ColorList','Sep','Scatter','MedLine','Quantiles','QtLine'}ColorMode='Order'   % 上色模式'Order'/'X'/'GlobalX'/'Kdensity'/'Qt'ColorListdefaultColorList1=[0.3725    0.2745    0.5647;    0.1137    0.4118    0.5882;    0.2196    0.6510    0.6471;    0.0588    0.5216    0.32940.4510    0.6863    0.2824;    0.9294    0.6784    0.0314;    0.8824    0.4863    0.0196;    0.8000    0.3137    0.24310.5804    0.2039    0.4314;    0.4353    0.2510    0.4392];defaultColorList2=[0.0015    0.0005    0.0139;    0.0143    0.0122    0.0705;    0.0415    0.0323    0.1373;    0.0773    0.0535    0.2088;    0.1179    0.0664    0.2854;    0.1661    0.0678    0.3630;    0.2209    0.0609    0.4276;    0.2758    0.0616    0.4677;    0.3279    0.0755    0.4889;    0.3784    0.0954    0.5001;    0.4284    0.1160    0.5058;    0.4788    0.1357    0.5080;    0.5297    0.1541    0.5070;    0.5814    0.1715    0.5028;    0.6338    0.1882    0.4951;    0.6867    0.2051    0.4836;    0.7395    0.2231    0.4679;    0.7914    0.2438    0.4480;    0.8410    0.2692    0.4245;    0.8861    0.3019    0.3992;    0.9240    0.3441    0.3761;    0.9524    0.3958    0.3617;    0.9715    0.4540    0.3610;    0.9837    0.5147    0.3747;    0.9912    0.5758    0.4003;    0.9954    0.6364    0.4350;    0.9972    0.6964    0.4765;    0.9971    0.7559    0.5234;    0.9956    0.8150    0.5747;    0.9930    0.8739    0.6300;    0.9899    0.9327    0.6886;    0.9871    0.9914    0.7495];defaultColorList3=[255,153,154;220,220,220;153,153,253]./255;Sep=1/8;          % 两个山脊间距离Scatter='off';    % 是否绘制竖线状散点MedLine='off';QtLine='off';Quantiles=[.25,.75];QtX,QtYridgeNum,Data,minX,maxX,maxY,XiSet,FSetridgePatchHdl,ridgeLineHdlmedLineHdl,scatterHdl;QtLineHdl;QtLegendHdlendmethodsfunction obj=joyPlot(Data,varargin)obj.Data=Data;obj.ridgeNum=length(obj.Data);% 获取其他数据disp(char([64 97 117 116 104 111 114 32 58 32,...115 108 97 110 100 97 114 101 114]))for i=1:2:(length(varargin)-1)tid=ismember(obj.arginList,varargin{i});if any(tid)obj.(obj.arginList{tid})=varargin{i+1};endendif isempty(intersect(obj.ColorMode,{'Order','X','GlobalX','Kdensity','Qt'}))error('The ColorMode should be one of the following: Order \ X \ GlobalX \ Kdensity \ Qt')endswitch obj.ColorModecase 'Order',obj.ColorList=obj.defaultColorList1;case 'X',obj.ColorList=obj.defaultColorList2;case 'GlobalX',obj.ColorList=obj.defaultColorList2;case 'Kdensity',obj.ColorList=obj.defaultColorList2;case 'Qt',obj.ColorList=obj.defaultColorList3;endfor i=1:2:(length(varargin)-1)tid=ismember(obj.arginList,varargin{i});if any(tid)obj.(obj.arginList{tid})=varargin{i+1};endendobj.minX=min(obj.Data{1});obj.maxX=max(obj.Data{1});for i=1:obj.ridgeNumobj.minX=min(obj.minX,min(obj.Data{i}));obj.maxX=max(obj.maxX,max(obj.Data{i}));endendfunction obj=draw(obj)obj.ax=gca;hold on;obj.ax.LineWidth=1;obj.ax.YTick=(1:obj.ridgeNum).*obj.Sep;obj.ax.FontName='Cambria';obj.ax.FontSize=13;obj.ax.YGrid='on';% obj.ax.Box='on';obj.ax.TickDir='out';tYLabel{obj.ridgeNum}='';for i=1:obj.ridgeNumtYLabel{i}=['Class-',num2str(i)];endobj.ax.YTickLabel=tYLabel;view(2)% 调整初始界面大小fig=obj.ax.Parent;fig.Color=[1,1,1];if max(fig.Position(3:4))<690fig.Position(3:4)=1.2.*fig.Position(3:4);fig.Position(1:2)=fig.Position(1:2)./2;end% 绘制patch图像obj.minX=min(obj.Data{1});obj.maxX=max(obj.Data{1});obj.maxY=0;for i=1:obj.ridgeNumtX=obj.Data{i};tX=tX(:)';[F,Xi]=ksdensity(tX);obj.minX=min(obj.minX,min(Xi));obj.maxX=max(obj.maxX,max(Xi));obj.maxY=max(obj.maxY,max(F));endfor i=obj.ridgeNum:-1:1tX=obj.Data{i};tX=tX(:)';[F,Xi]=ksdensity(tX);OXi=Xi;Xi=linspace(min(Xi),max(Xi),1000);F=interp1(OXi,F,Xi);obj.XiSet{i}=Xi;obj.FSet{i}=F;% 绘制竖线散点tXX=[tX;tX;tX.*nan];tYY=[tX.*0+obj.Sep.*i-obj.Sep./10;tX.*0+obj.Sep.*i-obj.Sep./2.5;tX.*nan];if isequal(obj.ColorMode,'Order')obj.scatterHdl(i)=plot(tXX(:),tYY(:),'Color',[obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:),.5],'LineWidth',.8,'Visible','off');elseobj.scatterHdl(i)=plot(tXX(:),tYY(:),'Color',[0,0,0,.5],'LineWidth',.8,'Visible','off');endif isequal(obj.Scatter,'on'),set(obj.scatterHdl(i),'Visible','on');end% 计算分位线for j=1:length(obj.Quantiles)obj.QtX(i,j+1)=quantile(tX,obj.Quantiles(j));obj.QtY(i,j)=interp1(Xi,F,quantile(tX,obj.Quantiles(j)));endobj.QtX(i,1)=min(Xi)-inf;obj.QtX(i,length(obj.Quantiles)+2)=max(Xi)+inf;switch obj.ColorModecase 'Order'obj.ridgePatchHdl(i)=fill([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:),'EdgeColor','none','FaceAlpha',.5);obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...'Color',obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:),'LineWidth',.8);colormap(obj.ColorList);try caxis([1,obj.ridgeNum]),catch,endtry clim([1,obj.ridgeNum]),catch,endcase 'X'tTi=[Xi(1),Xi,Xi(end)]-min(Xi);tTi=tTi./max(tTi);tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);obj.ridgePatchHdl(i)=surf([Xi(1),Xi,Xi(end);Xi(1),Xi,Xi(end)],[0,F.*0,0;0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),[tTi;tTi].*0,...'CData',tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...'Color',[0,0,0,.9],'LineWidth',.8);colormap(obj.ColorList);try caxis([-1,1]),catch,endtry clim([-1,1]),catch,end% fill函数老版本代码% tTi=[Xi(1),Xi,Xi(end),Xi(end:-1:1)]-min(Xi);tTi=tTi./max(tTi);% tT=linspace(0,1,size(obj.ColorList,1));% tC=cat(3,interp1(tT,obj.ColorList(:,1),tTi),interp1(tT,obj.ColorList(:,2),tTi),interp1(tT,obj.ColorList(:,3),tTi));% obj.ridgePatchHdl(i)=fill([Xi(1),Xi,Xi(end),Xi(end:-1:1)],[0,F,0,F.*0]+obj.Sep.*(i).*ones(1,length(F)*2+2),...%     tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');% obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...%     'Color',[0,0,0,.9],'LineWidth',.8);% colormap(obj.ColorList);% try caxis([-1,1]),catch,end% try clim([-1,1]),catch,endcase 'GlobalX'tTi=[Xi(1),Xi,Xi(end)]-obj.minX;tTi=tTi./(obj.maxX-obj.minX);tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);obj.ridgePatchHdl(i)=surf([Xi(1),Xi,Xi(end);Xi(1),Xi,Xi(end)],[0,F.*0,0;0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),[tTi;tTi].*0,...'CData',tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...'Color',[0,0,0,.9],'LineWidth',.8);colormap(obj.ColorList);try caxis([obj.minX,obj.maxX]),catch,endtry clim([obj.minX,obj.maxX]),catch,end% fill函数老版本代码% tTi=[Xi(1),Xi,Xi(end),Xi(end:-1:1)]-obj.minX;% tTi=tTi./(obj.maxX-obj.minX);% tT=linspace(0,1,size(obj.ColorList,1));% tC=cat(3,interp1(tT,obj.ColorList(:,1),tTi),interp1(tT,obj.ColorList(:,2),tTi),interp1(tT,obj.ColorList(:,3),tTi));% obj.ridgePatchHdl(i)=fill([Xi(1),Xi,Xi(end),Xi(end:-1:1)],[0,F,0,F.*0]+obj.Sep.*(i).*ones(1,length(F)*2+2),...%     tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');% obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...%     'Color',[0,0,0,.9],'LineWidth',.8);% colormap(obj.ColorList);% try caxis([obj.minX,obj.maxX]),catch,end% try clim([obj.minX,obj.maxX]),catch,endcase 'Kdensity'tTi=[0,F,0];tTi=tTi./obj.maxY;tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);obj.ridgePatchHdl(i)=surf([Xi(1),Xi,Xi(end);Xi(1),Xi,Xi(end)],[0,F.*0,0;0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),[tTi;tTi].*0,...'CData',tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...'Color',[0,0,0,.9],'LineWidth',.8);colormap(obj.ColorList);try caxis([0,obj.maxY]),catch,endtry clim([0,obj.maxY]),catch,end% fill函数老版本代码% tTi=[0,F,0,F(end:-1:1)];% tTi=tTi./obj.maxY;% tT=linspace(0,1,size(obj.ColorList,1));% tC=cat(3,interp1(tT,obj.ColorList(:,1),tTi),interp1(tT,obj.ColorList(:,2),tTi),interp1(tT,obj.ColorList(:,3),tTi));% obj.ridgePatchHdl(i)=fill([Xi(1),Xi,Xi(end),Xi(end:-1:1)],[0,F,0,F.*0]+obj.Sep.*(i).*ones(1,length(F)*2+2),...%     tC,'EdgeColor','none','FaceAlpha',.9,'FaceColor','interp');% obj.ridgeLineHdl(i)=plot([Xi(1),Xi,Xi(end)],[0,F,0]+obj.Sep.*(i).*ones(1,length(F)+2),...%     'Color',[0,0,0,.9],'LineWidth',.8);% colormap(obj.ColorList);% try caxis([0,obj.maxY]),catch,end% try clim([0,obj.maxY]),catch,endcase 'Qt'tTi=[Xi(1),Xi,Xi(end)];tR=tTi.*0;tG=tTi.*0;tB=tTi.*0;for j=1:size(obj.QtX,2)-1tR(tTi>=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTii};F=obj.FSet{i};switch obj.ColorModecase 'Order'set(obj.ridgePatchHdl(i),'FaceColor',obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:));case 'X'tTi=[Xi(1),Xi,Xi(end)]-min(Xi);tTi=tTi./max(tTi);tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);set(obj.ridgePatchHdl(i),'CData',tC);case 'GlobalX'tTi=[Xi(1),Xi,Xi(end)]-obj.minX;tTi=tTi./(obj.maxX-obj.minX);tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);set(obj.ridgePatchHdl(i),'CData',tC);case 'Kdensity'tTi=[0,F,0];tTi=tTi./obj.maxY;tT=linspace(0,1,size(obj.ColorList,1));tR=interp1(tT,obj.ColorList(:,1),tTi);tG=interp1(tT,obj.ColorList(:,2),tTi);tB=interp1(tT,obj.ColorList(:,3),tTi);tC=cat(3,[tR;tR],[tG;tG],[tB;tB]);set(obj.ridgePatchHdl(i),'CData',tC);case 'Qt'tTi=[Xi(1),Xi,Xi(end)];tR=tTi.*0;tG=tTi.*0;tB=tTi.*0;for j=1:size(obj.QtX,2)-1tR(tTi>=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi=obj.QtX(i,j)&tTi:})endfunction setRidgeLine(obj,n,varargin)set(obj.ridgeLineHdl(n),varargin{:})end% 设置各个分位线属性function setMedLine(obj,n,varargin)set(obj.medLineHdl(n),varargin{:})endfunction setQtLine(obj,n,varargin)set(obj.QtLineHdl(n),varargin{:})end% 设置scatter属性function setScatter(obj,n,varargin)set(obj.scatterHdl(n),varargin{:})endend
% @author : slandarer
% gzh     : slandarer随笔 
% Zhaoxu Liu / slandarer (2023). joyplot 
% (https://www.mathworks.com/matlabcentral/fileexchange/125255-joyplot), 
% MATLAB Central File Exchange. 检索来源 2023/2/23.
end


编程不易,希望大家该点赞的点赞,该在看的在看!!

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

Zhaoxu Liu / slandarer (2023). joyplot (https://www.mathworks.com/matlabcentral/fileexchange/125255-joyplot), MATLAB Central File Exchange. 检索来源 2023/2/23.

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

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...