a(30,2)
最初の列が一意のサンプル番号で、2 番目の列がサンプルに割り当てられた値である配列があります。2 列目のヒストグラムをプロットします。
hist(a(:,2))
ビンがN
あり、y 軸は x の値を持つサンプルの数を教えてくれますが、どのサンプルがどのビンにあるかについての情報はありません。
a
各ビンの上に、各ビンに分類されるサンプル (配列の最初の列からの番号) のリストをプロットするにはどうすればよいですか?
@Jonasと@Itamar Katzの両方で示されているように、 HISTCを使用して各サンプルが属するビン インデックスを取得し、BAR を使用して結果をプロットするという考え方です ( 'histc'
BAR 関数の表示モードを使用することに注意してください)。 . 以下の私の答えは、@Jonas の投稿のバリエーションです。
%# random data
a = [(1:30)' rand(30,1)]; %'#
%# compute edges (evenly divide range into bins)
nBins = 10;
edges = linspace(min(a(:,2)), max(a(:,2)), nBins+1);
%# compute center of bins (used as x-coord for labels)
bins = ( edges(1:end-1) + edges(2:end) ) / 2;
%# histc
[counts,binIdx] = histc(a(:,2), edges);
counts(end-1) = sum(counts(end-1:end)); %# combine last two bins
counts(end) = []; %#
binIdx(binIdx==nBins+1) = nBins; %# also fix the last bin index
%# plot histogram
bar(edges(1:end-1), counts, 'histc')
%#bar(bins, counts, 'hist') %# same thing
ylabel('Count'), xlabel('Bins')
%# format the axis
set(gca, 'FontSize',9, ...
'XLim',[edges(1) edges(end)], ... %# set x-limit to edges
'YLim',[0 2*max(counts)], ... %# expand ylimit to accommodate labels
'XTick',edges, ... %# set xticks on the bin edges
'XTickLabel',num2str(edges','%.2f')) %'# round to 2-digits
%# add the labels, vertically aligned on top of the bars
hTxt = zeros(nBins,1); %# store the handles
for b=1:nBins
hTxt(b) = text(bins(b), counts(b)+0.25, num2str(a(b==binIdx,1)), ...
'FontWeight','bold', 'FontSize',8, 'EdgeColor','red', ...
'VerticalAlignment','bottom', 'HorizontalAlignment','center');
end
%# set the y-limit according to the extent of the text
extnt = cell2mat( get(hTxt,'Extent') );
mx = max( extnt(:,2)+extnt(:,4) ); %# bottom+height
ylim([0 mx]);
x 軸の目盛が混み合っている場合は、XTICKLABEL_ROTATE関数 (FEX での送信) を使用して角度を付けて回転させて表示できます。
まず、@Itamar Katzの提案に従って HISTCを使用してヒストグラムを作成します。ビンをHISTと同じにするには、ビンのエッジを適切に計算する必要があります。次に、分布をプロットし、TEXTおよびNUM2STRを使用してラベルを追加できます。
%# get the edges, bin centers
nBins = 10;
edges = linspace(min(a(:,2),max(a(:,2),nBins+1); %# edges go from minimum to maximum of distribution
bins = (edges(1:end-1)+edges(2:end))/2;
%# get the counts and the bin-index
[counts,binIdx] = histc(a(:,2),edges);
%# plot the counts and bins (not edges) with `bar`
figure
bar(bins,counts);
%# Set the axes limits such that you have enough space for the labels
ylim([0,2*max(counts)]);
%# add the labels. Vertically align such that the text goes from the y-coordinate
%# down (as opposed to being centered on the y-coordinate).
for b = 1:nBins
text(bins(b),counts(b)*2,num2str(a(b==binIdx,1)),'VerticalAlignment','top')
end
各エントリのインデックスを返すを使用histc
して、どのビンに「落ちた」かを示します。
[n, ビン] = histc (a(:, 2), ビン);
次に、k 番目のビンの上のサンプルは次のとおりです。
a(ビン==k、1);
注意してください。ビンの境界を自分で指定する必要があります (境界hist
間の中間値を使用するのとは異なります)。