0

transitions=zeros(101,101)3D ヒストグラムとしてプロットしたい配列の間隔 [0,1] でデータをサンプリングしました。transitionsこのスレッドの最後に提供されているサンプル データと同様のデータで満たされています。

最初の列は最初に観測された変数を参照しX、2 番目の列は 2 番目の変数Yを参照し、3 番目の列は正規化された頻度です。つまり、最初の行: 変数ペアの観測された正規化された度数(0,0)は 0.9459 です。(0,Y)したがって、正規化された周波数の合計は です1

次のコードを使用して、3D ヒストグラムを (一種の) 作成しようとしました。

        x_c = (transitions(:,1) * 100)+1;
        y = (transitions(:,2) * 100)+1;
        z = transitions(:,4);
        %A = zeros(10,10);
        A = zeros(max(x_c),max(y));
        for i = 1:length(x_c)
            try
                    if(z(i)>0)
                        A(int32(x_c(i)), int32(y(i))) = abs(log(z(i)));
                    else
                        % deal with exceptions regarding log(0)
                        A(int32(x_c(i)), int32(y(i))) = 0;
                    end
            catch
                disp('');
            end
        end
        bar3(A);

ただし、離散空間でサンプリングされたデータであるためA、出力は次のプロットのようになります。プロットに「ギャップ」があるため、これは誤解を招く可能性があります(サンプルデータがない座標の場合、z 値 = 0)。むしろ、サンプリングされたデータを対応するプロットに割り当てて、「実際の」3D ヒストグラムを作成したいと考えています。

偽のヒストグラム

ちなみに、私の「ハック」の結果A、x、y、z スケールも正しくありません。3D ヒストグラムの軸 (3 つすべて) は [0,1] の間隔にある必要があります。

ans =

     0         0    0.9459
     0    0.0500    0.0256
     0    0.1000    0.0098
     0    0.1100    0.0004
     0    0.1500    0.0055
     0    0.1600    0.0002
     0    0.2000    0.0034
     0    0.2100    0.0001
     0    0.2500    0.0024
     0    0.2600    0.0001
     0    0.3000    0.0018
     0    0.3200    0.0000
     0    0.3700    0.0000
     0    0.4000    0.0010
     0    0.4200    0.0000
     0    0.4500    0.0007
     0    0.5000    0.0007
     0    0.5300    0.0000
     0    0.5500    0.0005
     0    0.6000    0.0005
     0    0.6300    0.0000
     0    0.7000    0.0002
     0    0.7400         0
     0    0.7500    0.0003
     0    0.7900    0.0000
     0    0.8000    0.0002
     0    0.8400    0.0000
     0    0.8500    0.0002
     0    0.8900    0.0000
     0    0.9000    0.0002
     0    0.9500    0.0001
     0    1.0000    0.0001
0.0500         0    0.0235
0.0500    0.0500    0.0086
0.0500    0.1000    0.0045

     .         .         .
     .         .         .
     .         .         .
     .         .         .
     .         .         .
0.9500    0.9000    0.0035
0.9500    0.9500    0.0066
0.9500    1.0000    0.0180
1.0000         0    0.0001
1.0000    0.0500    0.0001
1.0000    0.1000    0.0001
1.0000    0.1100    0.0000
1.0000    0.1500    0.0001
1.0000    0.1600    0.0000
1.0000    0.2000    0.0001
1.0000    0.2100    0.0000
1.0000    0.2500    0.0001
1.0000    0.2600    0.0000
1.0000    0.3000    0.0001
1.0000    0.3200    0.0000
1.0000    0.3700    0.0000
1.0000    0.4000    0.0002
1.0000    0.4200         0
1.0000    0.4500    0.0002
1.0000    0.5000    0.0003
1.0000    0.5300    0.0000
1.0000    0.5500    0.0004
1.0000    0.6000    0.0004
1.0000    0.6300    0.0000
1.0000    0.7000    0.0007
1.0000    0.7400    0.0000
1.0000    0.7500    0.0010
1.0000    0.7900    0.0000
1.0000    0.8000    0.0015
1.0000    0.8400    0.0001
1.0000    0.8500    0.0024
1.0000    0.8900    0.0002
1.0000    0.9000    0.0042
1.0000    0.9500    0.0111
1.0000    1.0000    0.3998
4

2 に答える 2

2

集計されていないデータに取り組むことで解決策を見つけました。特に、データセットの各行にはとのtransitions1 つの観測値が含まれています。以下のコードを使用して、次のように正規化された 3D ヒストグラム (および 2D マップ) を生成しました。XY

正規化された 3D ヒストグラム

function createHistogram(transitions)
   uniqueValues = unique(transitions(:,1));
   biases = cell(numel(uniqueValues),1);

   for i = 1:numel(uniqueValues)
       start = min(find(transitions(:,1) == uniqueValues(i)));
       stop = max(find(transitions(:,1) == uniqueValues(i)));
       biases(i) = mat2cell(transitions(start:stop,2));
   end

   combinedBiases = padcat(biases{1},biases{2},biases{3},biases{4},...
       biases{5},biases{6},biases{7},biases{8},biases{9},biases{10},...
       biases{11},biases{12},biases{13},biases{14},biases{15},biases{16},...
       biases{17},biases{18},biases{19});

   bins = 0:0.1:1;
   [f, x] = hist(combinedBiases, bins);

   %
   % normalize
   %
   for i = 1:numel(f(1,:))
       for j = 1:numel(f(:,i))
            f(j,i) = f(j,i)/numel(biases{i});
       end
   end
   bHandle = bar3(x, f);
   ylim([-0.04,1.04])
   for k = 1:length(bHandle)
        zdata = get(bHandle(k),'ZData');
        set(bHandle(k),'CData',zdata, 'FaceColor','interp');
   end
   colormap('autumn');
   hcol = colorbar();
   axis('square');
   cpos=get(hcol,'Position');
   cpos(4)=cpos(4)/3; % Halve the thickness
   cpos(2)=0.4; % Move it down outside the plot#
   cpos(1)=0.82;
   set(hcol, 'Position',cpos);
   xlabel('Enrollment biases');
   ylabel('Aging biases');
   zlabel('Bias transition probability');
   title(strcat('Probability mass function of bias transitions (', device,')'));
   set(gca,'XTick',0:2:20);
   set(gca,'XTickLabel',0:0.1:1);
   print('-dpng','-r600',strcat('tau_PMF3D_enrollment-ageing-', device));
   view(2);
   cpos(1)=0.84;
   set(hcol, 'Position',cpos);
   print('-dpng','-r600',strcat('tau_PMF2D_enrollment-ageing-', device));
end
于 2014-06-02T09:38:57.930 に答える
0

質問のコメントから、各ビン数を表す値があるようです。その場合、代わりの解決策は、正しい x および y スケールを使用して hist3 を使用して「ジャンク」データをプロットし、ビン データで作成されたサーフェス オブジェクトの zdata を更新することです (正しい形式になるように変更されます)。
ビン データに対するこの変更は非常に単純で、行列に再形成し、すべての要素を複製してパディングすることで構成されます。この方法は以下のコードに含まれています。

ans質問の最後の変数に基づいて、

  • ans(:,1) は x 値を与える
  • ans(:,2) は y 値を与える
  • ans(:,3) は、正規化されたビンのカウントを返します

コード

%// Inputs
zdata=ans(:,3);  %// zdata=rand(21*21,1); % for testing
xvalues = 0:0.05:1; 
yvalues = 0:0.05:1;

%// plot with junk data, [0,0] in this case
nx = numel(xvalues); ny = numel(yvalues);    
bincenters = { xvalues , yvalues };
hist3([0,0],bincenters);
Hsurface = get(gca,'children');

%// apply bin count format
pad = [0 0 0 0 0;0 1 1 0 0;0 1 1 0 0;0 0 0 0 0;0 0 0 0 0]; %// padding for each point
ztrans=kron(reshape(zdata,[nx,ny]),pad); %// apply padding to each point

%// update plot
set(Hsurface,'ZData',ztrans)

%// to set colour based on bar height
colormap('autumn');
set(Hsurface,'CData',ztrans,'FaceColor','interp')

出力

ここに画像の説明を入力

于 2014-06-02T12:03:07.307 に答える