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

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.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(以上是关于MATLAB | 如何用MATLAB绘制花里胡哨的山脊图的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 这些花里胡哨的热图怎么画

如何用matlab绘制三维地形图

如何用MATLAB绘制双曲线?

如何用matlab画直方图

如何用matlab给地图标点?

如何用matlab来实现绘制工业摄像机站位的