当前位置: 首页 > news >正文

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

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

依旧工具函数放在文末。


教程部分

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.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;% 调整初始界面大小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),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,endtry clim([-1,1]),catch,endcase 'GlobalX'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,endtry clim([obj.minX,obj.maxX]),catch,endcase 'Kdensity'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,endtry clim([0,obj.maxY]),catch,endcase 'Qt'tTi=[Xi(1),Xi,Xi(end),Xi(end:-1:1)];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+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,1);tG(tTi>=obj.QtX(i,j)&tTi<obj.QtX(i,j+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,2);tB(tTi>=obj.QtX(i,j)&tTi<obj.QtX(i,j+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,3);endtC=cat(3,tR,tG,tB);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,endtry clim([-1,1]),catch,endend% 绘制中位线tMedX=median(tX);tMedY=interp1(Xi,F,tMedX);obj.medLineHdl(i)=plot([tMedX,tMedX],[0,tMedY]++obj.Sep.*[i,i],'LineStyle','--','LineWidth',1,'Color',[0,0,0],'Visible','off'); if isequal(obj.MedLine,'on'),set(obj.medLineHdl(i),'Visible','on');end% 绘制分位线tQtY=[obj.QtY(i,:);obj.QtY(i,:).*0;obj.QtY(i,:).*nan]+obj.Sep.*i;tQtX=[obj.QtX(i,2:end-1);obj.QtX(i,2:end-1);obj.QtX(i,2:end-1).*nan];obj.QtLineHdl(i)=plot(tQtX(:),tQtY(:),'LineWidth',1,'Color',[0,0,0,.8],'Visible','off');if isequal(obj.QtLine,'on'),set(obj.QtLineHdl(i),'Visible','on');end% % 绘制25,75分位线% tQt25X=quantile(tX,0.25);% tQt75X=quantile(tX,0.75);% tQt25Y=interp1(Xi,F,tQt25X);% tQt75Y=interp1(Xi,F,tQt75X);% obj.qt25LineHdl(i)=plot([tQt25X,tQt25X],[0,tQt25Y]+obj.Sep.*[i,i],'LineWidth',1,'Color',[1,1,1,.8],'Visible','off');% obj.qt75LineHdl(i)=plot([tQt75X,tQt75X],[0,tQt75Y]+obj.Sep.*[i,i],'LineWidth',1,'Color',[1,1,1,.8],'Visible','off');% if isequal(obj.QT25Line,'on'),set(obj.qt25LineHdl(i),'Visible','on');end% if isequal(obj.QT75Line,'on'),set(obj.qt75LineHdl(i),'Visible','on');endendaxis tightobj.ax.YLim(1)=obj.Sep/2;for i=1:size(obj.QtX,2)-1obj.QtLegendHdl(i)=fill(mean(obj.ax.XLim).*[1,1,1,1],mean(obj.ax.YLim).*[1,1,1,1],...obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:),'EdgeColor','none','FaceAlpha',.9);endend% 获取绘制图例对象function legendHdl=getLegendHdl(obj)if isequal(obj.ColorMode,'Qt')legendHdl=obj.QtLegendHdl;elselegendHdl=obj.ridgePatchHdl;endend% 颜色重设置function obj=setPatchColor(obj,ColorList)obj.ColorList=ColorList;colormap(obj.ColorList);for i=obj.ridgeNum:-1:1Xi=obj.XiSet{i};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),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));set(obj.ridgePatchHdl(i),'CData',tC);case 'GlobalX'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));set(obj.ridgePatchHdl(i),'CData',tC);case 'Kdensity'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));set(obj.ridgePatchHdl(i),'CData',tC);case 'Qt'tTi=[Xi(1),Xi,Xi(end),Xi(end:-1:1)];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+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,1);tG(tTi>=obj.QtX(i,j)&tTi<obj.QtX(i,j+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,2);tB(tTi>=obj.QtX(i,j)&tTi<obj.QtX(i,j+1))=obj.ColorList(mod(j-1,size(obj.ColorList,1))+1,3);endtC=cat(3,tR,tG,tB);set(obj.ridgePatchHdl(i),'CData',tC);endendfor i=1:size(obj.QtX,2)-1set(obj.QtLegendHdl(i),'FaceColor',obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:));endend% 设置Patch及Line对象其他属性function setRidgePatch(obj,n,varargin)set(obj.ridgePatchHdl(n),varargin{:})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链接及本文链接!!!!!

相关文章:

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

本期推送教大家如何绘制各种样式的山脊图&#xff0c;这里做了一个工具函数用来实现好看的山脊图的绘制&#xff0c;编写不易请多多点赞&#xff0c;大体绘制效果如下&#xff1a; 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中&#xff0c;…...

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…...

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…...

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一&#xff0c;它总是隐藏在容器的背后&#xff0c;默默工作&#xff0c;默默付出。本文为《STL 源码剖析》读书笔记&#xff0c;主要讨论 SGI 版本空间的配置和释放&#xff0c;对代码进行解读时会改变一些写法&#xff0c;使其更易于阅读。…...

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一&#xff0c;历史悠久&#xff0c;源远流长。白酒指以高粱等粮谷为主要原料&#xff0c;以大曲、小曲或麸曲及酒母等为糖化发酵剂&#xff0c;经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的&#xff0c;酒精度(体积分数)在18%-68%…...

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】

合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...

华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)

英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head

绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...

LLFlow沦为和代码解读

LLFlow沦为和代码解读 1.测试时代码的运行位置 sr&#xff1a;什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...

C语言学习及复习笔记-【9】数组

目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往…...

Kubernetes入门教程 --- 使用kubeadm进行集群安装

Kubernetes入门教程 --- 使用kubeadm和二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.5 时间同步2.6 安装组件2.7 部署集群2.8 Master安装网络插卡3. 查询状态3.1 查询n…...

华为OD机试真题Python实现【相对开音节】真题+解题思路+代码(20222023)

相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外) 常见的单词有bike cake 给定一个字符串,以空格为分隔符 反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数 (连续子串中部分字符可以重复) …...

海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路

1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…...

javaee之node.js与es6

问题1&#xff1a;在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2&#xff1a;response.end()作用 在Web开发中&#xff0c;浏览器端的请求到达服务器进行处理的时候&#xff0c;Response.End的作用就是让request执行到此结束&#xff0c;输出到客户…...

11 nacos源码开篇

nacos核心功能点&#xff1a; 服务注册&#xff1a;Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务&#xff0c;提供自身的元数据&#xff0c;比如ip地址、端口等信息。Nacos Server接收到注册请求后&#xff0c;就会把这些元数据信息存储在一个双层的内存…...

13.Jenkins集成sonarqube

Jenkins集成sonarqube1.jenkins集成sonarqube2.jenkins以maven的方式集成sonarqube scanner报错1报错21.jenkins集成sonarqube 1.在jenkins插件管理中安装sonarqube scanner 2.jenkins要知道sonarqube服务端是谁&#xff0c;需要配置&#xff08;系统管理–系统配置–sonarq…...

JavaWeb13-线程休眠和指定唤醒:LockSupport

目录 1.LockSupport.park()&#xff1a;休眠当前线程 2.LockSupport.unpark(线程对象)&#xff1a;唤醒某一个指定的线程 3.扩展&#xff1a;LockSupport.parkUntil(long)等待最大时间是一个固定时间 4.LockSupport和Interrupt 5.LockSupport VS wait 相同点&#xff1a;…...

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式创建对象,注入属性)】

第一章&#xff1a;Spring概述、特点、IOC容器、IOC操作bean管理&#xff08;基于xml方式创建对象&#xff0c;注入属性&#xff09; 1.Spring是什么&#xff1f; ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring&#xff1a;Spring技术栈&#xff0c;Spring不再…...

前端react面试题(边面边更)

展示组件(Presentational component)和容器组件(Container component)之间有何不同 展示组件关心组件看起来是什么。展示专门通过 props 接受数据和回调&#xff0c;并且几乎不会有自身的状态&#xff0c;但当展示组件拥有自身的状态时&#xff0c;通常也只关心 UI 状态而不是…...

产品3C认证在哪里办理

​一、什么是CCC认证 3C认证的全称为“中国强制性产品认证”&#xff0c;英文名称China Compulsory Certification&#xff0c;英文缩写CCC。它是中国政府为保护消费者人身安全和国家安全、加强产品质量管理、依照法律法规实施的一种产品合格评定制度。年12月&#xff0c;国家…...

UA-DETRAC数据集转YOLO格式

一&#xff1a; 数据集下载 原官方数据集 链接&#xff1a;https://pan.baidu.com/s/1P_CeSIpJIYSA1dykmFhgYw 提取码&#xff1a; 7f4g 处理完成数据集&#xff08;每10帧取一张&#xff09; 链接&#xff1a;后续添加 提取码&#xff1a;后续添加 二&#xff1a; 处理标…...

代码随想录---二叉树的总结和二叉树的定义

二叉树的种类&#xff1a; 满二叉树&#xff1a;树的所有节点都是满&#xff0c;即都有左右孩子。 这棵二叉树为满二叉树&#xff0c;也可以说深度为k&#xff0c;有2^k-1个节点的二叉树。 完全二叉树&#xff1a;完全二叉树的定义如下&#xff1a;在完全二叉树中&#xff0c…...

Hive SQL 执行计划

我们在写Hive SQL的时候&#xff0c;难免会在运行的时候有报错&#xff0c;所以知道Hive SQL的执行计划具体是什么&#xff0c;然后假如在之后的运行过程中有报错&#xff0c;可以根据执行计划定位问题&#xff0c;调试自己的SQL开发脚本。 一、含义 Hive SQL的执行计划描述S…...

MySQL InnoDB引擎——三层B+树可以存储多少数据量

先说结论&#xff1a; 3层B树大概可以存&#xff1a; 主键为bigint&#xff1a;约2000w主键为int&#xff1a;约4000w*备注&#xff1a; 在《阿里开发手册》中建议&#xff0c;单表行数超过500万行或者单表容量超过2GB&#xff0c;才推荐进行分库分表&#xff0c;如果预计三年后…...

部署跨云容灾的五大难点

为什么企业需要跨云容灾&#xff1f; 据统计&#xff0c;全球已有70%的企业使用云计算服务。上云帮助企业更高效地管理数据资产&#xff0c;但它并非绝对安全。如停电、漏水等机房事故&#xff1b;地震、火灾等自然性灾害&#xff1b;亦或是人为失误&#xff0c;都有可能造成数…...

Docker Compose

为什么需要使用Docker ComposeDocker Compose 容器编排技术1、现在我们有一个springboot项目&#xff0c;需要依赖Redis、mysql、nginx。如果使用docker原生部署的话&#xff0c;则需要安装Redis、mysql、nginx容器&#xff0c;才可以启动我们springboot项目&#xff0c;这样的…...

【ARM架构】armv8 系统安全概述

ARMv8-A 系统中的安全 一个安全或可信的操作系统保护着系统中敏感的信息&#xff0c;例如&#xff0c;可以保护用户存储的密码&#xff0c;信用卡等认证信息免受攻击。 安全由以下原则定义&#xff1a; 保密性&#xff1a;保护设备上的敏感信息&#xff0c;防止未经授权的访问…...