如何在Matlab中创建堆叠条形图,将某些值固定到特定颜色?

如何在Matlab中创建堆叠条形图,将某些值固定到特定颜色?,matlab,plot,Matlab,Plot,我试着做一个堆叠的条形图,它应该显示不同类型的岩石是如何随深度而变化的。我根据一些真实数据生成了一些虚拟的岩性系列,并希望以可读的方式呈现它们。现在我有了这个矩阵A: A = 2.0000 65.0000 1.0000 19.5000 2.0000 0.5000 4.0000 1.5000 2.0000 58.0000 4.0000 2.0000 2.0000 22.5000 3.0000 7.0000 2.0000 14.5000 3.0000

我试着做一个堆叠的条形图,它应该显示不同类型的岩石是如何随深度而变化的。我根据一些真实数据生成了一些虚拟的岩性系列,并希望以可读的方式呈现它们。现在我有了这个矩阵
A

A =

2.0000   65.0000
1.0000   19.5000
2.0000    0.5000
4.0000    1.5000
2.0000   58.0000
4.0000    2.0000
2.0000   22.5000
3.0000    7.0000
2.0000   14.5000
3.0000   12.5000
4.0000    2.5000
2.0000   31.5000
1.0000   20.0000
2.0000   20.0000
1.0000   15.5000
2.0000   66.0000
4.0000    0.5000
2.0000    2.5000
3.0000    8.0000
2.0000   61.0000
1.0000   17.5000
2.0000    8.0000
5.0000   19.5000
3.0000   24.5000
其中,第一列表示不同的岩石类型,第二列表示各岩性层的厚度(以米为单位)。现在我想把它画成一个核心数据日志。因此,从1到5的每种岩石类型都应该有一种特定的颜色,每个彩色条的厚度应该代表该岩石类型的厚度。如何实现这一点?

每种类型的聚合 您可以使用以下方法找到每种岩石类型的总厚度:

它将第二列的所有值与第一列中的相同数字相加。因此,对于示例数据,这将返回:

total_type_thickness =

   72.5000
  349.5000
   52.0000
    6.5000
   19.5000
困难的是将其显示为单个堆叠条,您可以尝试使用以下解决方法:

这会留下一个空列,您可以通过设置x限制来隐藏该列:

bar([total_type_thickness'; zeros(size(total_type_thickness'))],'stacked');
xlim([0.25 1.75])
% add a legend with 'Rock Type <ii>'
legend(arrayfun(@(ii) sprintf('Rock type %d',ii), 1:length(total_type_thickness), 'uni',false));
为了更方便地添加图例,我将向原始数据添加
M
虚拟值:

bar([NaN(1,M)  A(:,2)' ; NaN(1,N+M)],'stacked','facecolor','flat');
xlim([0.25 1.75])

cc = jet(M); % create colormap with N different colors
colormap(cc([(1:M)' ;A(:,1)],:)); % pick for each layer, the correct color and use it as a colormap
现在图例中的第一个
M
元素将对应于岩石类型1,2,。。M:

 legend(arrayfun(@(ii) sprintf('Rock type %d',ii), 1:length(total_type_thickness), 'uni',false));

是否需要显示5个堆叠条形图(显示每种岩石类型的总厚度总和)的汇总图?或者24个堆叠的条形图代表您的阵列,显示每个不同层的厚度和相应的颜色?嗨。我之前尝试过使用accumarray,但是我只绘制了不同层的总厚度,而不是所有层的厚度。。。你看,我想绘制每一层的深度。因此,我不希望有5个间隔,而是希望每行有一个间隔,不同的颜色可能会出现不止一次。。。无论如何,谢谢这正是我想要的,非常感谢=)
bar([NaN(1,M)  A(:,2)' ; NaN(1,N+M)],'stacked','facecolor','flat');
xlim([0.25 1.75])

cc = jet(M); % create colormap with N different colors
colormap(cc([(1:M)' ;A(:,1)],:)); % pick for each layer, the correct color and use it as a colormap
 legend(arrayfun(@(ii) sprintf('Rock type %d',ii), 1:length(total_type_thickness), 'uni',false));