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

news2024/9/25 3:18:12

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

依旧工具函数放在文末。


教程部分

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.4667
    0.8510    0.3725    0.0078
    0.4588    0.4392    0.7020
    0.6529    0.4059    0.3294
    0.9020    0.6706    0.0078
    0.6510    0.4627    0.1137
    0.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.4667
    0.8510    0.3725    0.0078
    0.4588    0.4392    0.7020
    0.6529    0.4059    0.3294
    0.9020    0.6706    0.0078
    0.6510    0.4627    0.1137
    0.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.
    properties
        ax,arginList={'ColorMode','ColorList','Sep','Scatter','MedLine','Quantiles','QtLine'}
        ColorMode='Order'   % 上色模式'Order'/'X'/'GlobalX'/'Kdensity'/'Qt'
        ColorList
        defaultColorList1=[0.3725    0.2745    0.5647;    0.1137    0.4118    0.5882;    0.2196    0.6510    0.6471;    0.0588    0.5216    0.3294
                           0.4510    0.6863    0.2824;    0.9294    0.6784    0.0314;    0.8824    0.4863    0.0196;    0.8000    0.3137    0.2431
                           0.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,QtY
        ridgeNum,Data,minX,maxX,maxY,XiSet,FSet
        ridgePatchHdl,ridgeLineHdl
        medLineHdl,scatterHdl;QtLineHdl;QtLegendHdl
    end

    methods
        function 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};
                end
            end
            if isempty(intersect(obj.ColorMode,{'Order','X','GlobalX','Kdensity','Qt'}))
                error('The ColorMode should be one of the following: Order \ X \ GlobalX \ Kdensity \ Qt')
            end
            switch obj.ColorMode
                case '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;
            end
            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
            obj.minX=min(obj.Data{1});
            obj.maxX=max(obj.Data{1});
            for i=1:obj.ridgeNum
                obj.minX=min(obj.minX,min(obj.Data{i}));
                obj.maxX=max(obj.maxX,max(obj.Data{i}));
            end
        end
        function 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.ridgeNum
                tYLabel{i}=['Class-',num2str(i)];
            end
            obj.ax.YTickLabel=tYLabel;

            % 调整初始界面大小
            fig=obj.ax.Parent;
            fig.Color=[1,1,1];
            if max(fig.Position(3:4))<690
                fig.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.ridgeNum
                tX=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));
            end
            for i=obj.ridgeNum:-1:1
                tX=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');
                else
                    obj.scatterHdl(i)=plot(tXX(:),tYY(:),'Color',[0,0,0,.5],'LineWidth',.8,'Visible','off');
                end
                if 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)));
                end
                obj.QtX(i,1)=min(Xi)-inf;
                obj.QtX(i,length(obj.Quantiles)+2)=max(Xi)+inf;
                switch obj.ColorMode
                    case '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,end
                        try clim([1,obj.ridgeNum]),catch,end
                    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));
                        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,end
                    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));
                        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,end
                    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));
                        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,end
                    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)-1
                            tR(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);
                        end
                        tC=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,end
                        try clim([-1,1]),catch,end
                end
                % 绘制中位线
                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');end
            end
            axis tight
            obj.ax.YLim(1)=obj.Sep/2;
            for i=1:size(obj.QtX,2)-1
                obj.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);
            end
        end
        % 获取绘制图例对象
        function legendHdl=getLegendHdl(obj)
            if isequal(obj.ColorMode,'Qt')
                legendHdl=obj.QtLegendHdl;
            else
                legendHdl=obj.ridgePatchHdl;
            end
        end
        % 颜色重设置
        function obj=setPatchColor(obj,ColorList)
            obj.ColorList=ColorList;
            colormap(obj.ColorList);
            for i=obj.ridgeNum:-1:1
                Xi=obj.XiSet{i};
                F=obj.FSet{i};
                switch obj.ColorMode
                    case '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)-1
                            tR(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);
                        end
                        tC=cat(3,tR,tG,tB);
                        set(obj.ridgePatchHdl(i),'CData',tC);
                end
            end
            for i=1:size(obj.QtX,2)-1
                set(obj.QtLegendHdl(i),'FaceColor',obj.ColorList(mod(i-1,size(obj.ColorList,1))+1,:));
            end
        end
        % 设置Patch及Line对象其他属性
        function setRidgePatch(obj,n,varargin)
            set(obj.ridgePatchHdl(n),varargin{:})
        end
        function setRidgeLine(obj,n,varargin)
            set(obj.ridgeLineHdl(n),varargin{:})
        end
        % 设置各个分位线属性
        function setMedLine(obj,n,varargin)
            set(obj.medLineHdl(n),varargin{:})
        end
        function setQtLine(obj,n,varargin)
            set(obj.QtLineHdl(n),varargin{:})
        end
        % 设置scatter属性
        function setScatter(obj,n,varargin)
            set(obj.scatterHdl(n),varargin{:})
        end
    end
% @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链接及本文链接!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle数据库常用操作

1.连接登录切换用户su - oracle以管理员模式登录到sqlplus&#xff1a;sqlplus / as sysdba oracle登录身份有三种&#xff1a;1.1Normal 普通身份&#xff1b;1.2.sysdba 系统管理员身份&#xff1b;若以 ‘sysdba’ 方式认证&#xff0c;登录用户为 ‘SYS’&#xff0c;为 Or…

spring事务管理器原理?mybatis如何集成spring事务管理器?

目录 1. spring事务管理器开启事务做了些什么事情&#xff1a; 1.1 创建mysql数据库连接&#xff1a; 1.2 开启mysql事务 1.3 将当前事务所使用的连接绑定到ThreadLocal中,供后续执行sql命令使用。 2. mybatis如何集成spring事务管理器&#xff1f; 3. mysql相关命令 4. …

Java常用框架(三)

三、SpringBoot 1.Spring及其优缺点&#xff1f; 1.1 概念 重量级企业开发框架EJB的替代品&#xff0c;通过依赖注入、面向切面编程&#xff0c;使用简单Java对象POJO为企业Java开发提供了相对简单的方法。 1.2 优缺点 1.2.1 优点 组件代码轻量级 1.2.1 缺点 配置重量级…

Spring Batch 高级篇-多线程步骤

目录 引言 概念 案例 转视频版 引言 接着上篇&#xff1a;Spring Batch ItemWriter组件&#xff0c;了解Spring Batch ItemWriter处理组件后&#xff0c;接下来一起学习一下Spring Batch 高级功能-多线程步骤 概念 默认的情况下&#xff0c;步骤基本上在单线程中执行&…

springBoot使用ShardingJDBC实现分表

ShardingSphere的介绍 ShardingSphere是一款起源于当当网内部的应用框架。2015年在当当网内部诞 生&#xff0c;最初就叫ShardingJDBC。2016年的时候&#xff0c;由其中一个主要的开发人员张亮&#xff0c; 带入到京东数科&#xff0c;组件团队继续开发。在国内历经了当当网、…

链动2+1系统|购买三单就能迅速回本,链动2+1模式到底有多暴利?

链动21模式号称起步创业无泡沫&#xff0c;半个月就能盈利上百万&#xff0c;用户裂变速度更是让人瞠目结舌。那么&#xff0c;链动21模式到底有多暴利&#xff1f;其实链动21模式最关键的&#xff0c;是合理的利润分配和奖励机制&#xff0c;让消费者在购物的同时&#xff0c;…

【解决报错】‘jupyter‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

在当前路径下使用cmd打开后&#xff0c;输入jupyter notebook出现如下错误&#xff1a; 通常可能出现的问题有两种&#xff1a; &#xff08;1&#xff09;你本身就没安装jupyter&#xff0c;如果你配置了anaconda&#xff0c;就自带jupyter&#xff0c;直接跳到问题2。如果确…

Confluence主页面更新记录停留在去年,搜索也只能搜索去年之前的数据问题解决方案

问题描述 Confluence主页最近更新页面不更新了&#xff0c;停留在之前的时间段。其次搜索也只能搜索出来停留在这个时间段之前的数据。 核心原因 索引出现问题了&#xff0c;重建索引即可。 解决办法 直接重启Confluence。 重启Confluence的姿势 描述一下我解决思路&…

28-vuex

vuex 一、vuex 专门在vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。 使用场景&a…

Java 【数据结构OJ题十道】—— 二叉树篇1

文章目录一、 检查两棵二叉树是否相同二、 另一棵二叉树的子树三、 二叉树的构建及遍历四、序列化二叉树和反序列化二叉树(难)五、二叉树创建字符串六、 二叉树前序非递归遍历实现七、 二叉树中序非递归遍历实现八、 二叉树后序非递归遍历实现九、二叉搜索树中找到两个结点的最…

如何将电脑文件备份到百度网盘

如何将电脑文件备份到百度网盘&#xff1f;说到文件备份&#xff0c;很多小伙伴会将电脑文件备份到移动硬盘或者U盘里&#xff0c;移动硬盘和U盘是比较常见的存储介质&#xff0c;使用和携带起来也是非常方便&#xff0c;因此深受大家的喜欢。除此之外&#xff0c;大家可能还忽…

2023年,IT互联网还有发展前景吗?

不得不说&#xff0c;互联网在整个社会经济发展中扮演着不可或缺的角色&#xff1b;不仅自身的技术具有前沿性&#xff0c;也推动着其他行业进入数字化经济时代&#xff0c;让我们的工作生活变得更加便捷。 在“互联网”时代&#xff0c;每个服务行业都会利用大数据&#xff0…

将自带记事本替换为Notepad2【中文版,带替换文件】

Notepad2是我在寻找一个合适的代码浏览工具的时候发现的&#xff0c;当需要一个用来浏览代码的文本编辑器时候&#xff0c;需要体积小&#xff0c;速度快&#xff0c;语法高亮&#xff0c;解释度高&#xff0c;VsCode作为生产环境已经不适合作为浏览工具了。了解到Notepad2&…

《动手学习深度学习》笔记(二)线性神经网络

三、线性神经网络 3.1 线性回归 3.1.1 介绍 1. 回归是为一个或多个自变量与因变量之间的关系建模的一类方法。而线性回归基于几个简单的假设&#xff1a;① 自变量和因变量关系是线性的&#xff1b;② 允许包含噪声但是噪声遵循正态分布。   2. 训练数据集/训练集&#xff…

算法训练营 day53 动态规划 买卖股票的最佳时机系列2

算法训练营 day53 动态规划 买卖股票的最佳时机系列2 买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。…

软件项目管理知识回顾---网络图

网络图 9.网络图 9.1简介 1.分类 AOA&#xff0c;双代号&#xff0c;ADMAON,PDM&#xff0c;单代号&#xff0c;前导图2.活动的逻辑管理 头到头/尾&#xff0c;尾到头/尾 依赖关系 3.工序 紧前紧后9.2绘制规则 1.两个节点只能一条线。不能是平行线。平行的话就不知道是哪个活动…

LeetCode-93. 复原 IP 地址

目录题目思路回溯法题目来源 93. 复原 IP 地址 题目思路 意识到这是切割问题&#xff0c;切割问题就可以使用回溯搜索法把所有可能性搜出来&#xff0c;和131.分割回文串就十分类似了。 回溯法 1.递归参数 startIndex一定是需要的&#xff0c;因为不能重复分割&#xff0c…

【GeoDjango框架解析】读取矢量数据写入postgis数据库

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 【GeoDjango框架解析】读取矢量数据写入postgis数据库 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列…

关于iframe一些通讯的记录(可适用工作流审批,文中有项目实践,欢迎咨询)

一.知识点(1).我们可以通过postMessage(发送方)和onmessage(接收方)这两个HTML5的方法, 来解决跨页面通信问题&#xff0c;或者通过iframe嵌套的不同页面之间的通信a.父页面代码如下<div v-if"src" class"iframe"><iframeref"iframe"id…

Kafka进阶篇-消费者详解Flume消费Kafka原理

简介 由于挺多时候如果不太熟系kafka消费者详细的话&#xff0c;很容易产生问题&#xff0c;所有剖析一定的原理很重要。 Kafka消费者图解 消费方式 消费者总体工作流程 消费者组初始化流程 消费者详细消费流程 消费者重要参数 bootstrap.servers 向 Kafka 集群建立初…