如何在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));