который использует среднее значение между границами).

я есть массивa(30,2) где первый столбец является уникальным номером образца, а второй столбец является значением, назначенным образцу. Я строю гистограмму 2-го столбца:

hist(a(:,2))

у меня естьN bins и ось y говорят мне, сколько сэмплов имеют значение x, но нет информации о том, какие сэмплы в каком бине.

Как построить, над каждой ячейкой, список образцов (число из первого столбца моего массива?a) что попадает в каждую корзину?

Ответы на вопрос(3)

Как показали оба@Jonas а также@ Итамар Кацидея состоит в том, чтобы использовать HISTC, чтобы получить индексы бина, к которым принадлежит каждый образец, а затем использовать BAR, чтобы отобразить результат (обратите внимание, что мы используем'histc' режим отображения для функции BAR). Мой ответ ниже - это вариант сообщения @ Jonas:

[EDITED]
%# 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).

 Amro12 янв. 2011 г., 16:04
@Jonas: спасибо за то, что обнаружили ошибку последнего бина, я ее исправил ... Думаю, стоит упомянуть, что в последнем бине HISTC считает только те значения, которые соответствуютedges(end) точно (именно поэтому я объединил последние два контейнера).
 Jonas12 янв. 2011 г., 03:16
Я немного подождал, прежде чем ответить, так как предположил, что это прямо в твоем переулке. И конечно вы даете хороший ответ с красивыми картинками! Один кирка:lastEdge на самом делеedges(end); Вам не нужно извлекать его за пределы осей. +1 в любом случае для более красивого решения, чем мое (мне нравятся прямоугольники), хотя я бы поместил текст на счет + 0,5.

Сначала создайте гистограмму, используяHISTC как предложено@ Итамар Кац, Чтобы сделать контейнеры так же, как сHIST, вам нужно правильно рассчитать края бина. Затем вы можете построить график распределения и добавить метки, используяТЕКСТ а также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
 Amro12 янв. 2011 г., 00:13
+1 именно то, что я думал, я отправил другое решение на основе вашего ответа

histc, которые возвращают индекс для каждой записи, на которую bin "упал":

[n, bin] = histc (a (:, 2), bin);

Тогда образцы над k-ым мусорным ведром:

a (bin == k, 1);

Обратите внимание, вы должны указать границы ящиков самостоятельно (в отличие отhist который использует среднее значение между границами).

Ваш ответ на вопрос