2

さまざまな種類の岩が深さによってどのように変化するかを示す積み上げ棒グラフを作成しようとしています。私はいくつかの実際のデータに基づいていくつかの架空の岩相シリーズを生成し、それらを読みやすい方法で提示したいと思います。だから今私はこの行列を持っています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

ここで、最初の列はさまざまな岩石の種類を表し、2番目の列は各岩相層の厚さ(メートル単位)を表します。そして今、私はこれをコアデータログのようにプロットしたいと思います。したがって、1〜5の各岩の種類には、1つの特定の色が必要であり、各色のバーの太さは、その岩の種類の太さを表す必要があります。どうすればこれを達成できますか?

4

1 に答える 1

2

タイプごとの集計

accumarrayを使用して、各岩石タイプの合計厚さを見つけることができます。

total_type_thickness = accumarray(A(:,1),A(:,2));

2 番目の列のすべての値を合計し、1 番目の列と同じ数になります。したがって、サンプルデータの場合、これは次を返します。

total_type_thickness =

   72.5000
  349.5000
   52.0000
    6.5000
   19.5000

難しいのは、積み上げられた単一のバーとして表示することです。次の回避策を試すことができます。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/57304

これにより、空の列が残りますが、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));

ここに画像の説明を入力

ベクトルデータを入力した場合、matlab はバーをスタックせず、その場合はバーを個別にプロットするため、今のところ、より良い代替手段は見つかりませんでした..

すべての値を表示、タイプごとに同じ色

すべてのデータ (すべてのレイヤー) をプロットするには、同じアプローチを使用できますが、カラーマップを使用してカラー データを手動で設定するようになりました。

N = size(A,1); % number of layers
M = max(A(:,1)); % number of different rock types

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

cc = jet(M); % create colormap with N different colors
colormap(cc(A(:,1),:)); % pick for each layer, the correct color and use it as a colormap

凡例を簡単に追加する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));

ここに画像の説明を入力

于 2012-09-24T09:39:10.340 に答える