Tengo una matriz a(30,2) donde la primera columna es un único número de la muestra y la segunda columna es un valor asignado a la muestra. Me trazar un histograma de la 2ª columna:

hist(a(:,2))

He N contenedores y el eje-y me dice cómo muchas de las muestras tienen un valor de x,
pero no hay información acerca de que las muestras están en la papelera.

¿Cómo puedo parcela, encima de cada compartimiento, una lista de ejemplos (el número de la primera columna de mi matriz a) que caen dentro de cada bin?

OriginalEl autor RobertD | 2011-01-11

3 Comentarios

  1. 5

    Como fue demostrado por ambos @Jonas y @Itamar Katz, la idea es utilizar HISTC para obtener los índices de reciclaje que cada muestra pertenece, a continuación, utilice la BARRA de la gráfica de resultados (nota de que utilizamos el 'histc' modo de pantalla para la función de la BARRA). Mi respuesta a continuación es una variación de @Jonas post:

    [EDITADO]

    %# 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]);

    Cómo mostrar las etiquetas sobre un histograma de reciclaje?

    Si las garrapatas en el eje de las x se vuelven demasiado lleno de gente, puede mostrar girar con un ángulo utilizando XTICKLABEL_ROTATE función (presentación en FEX).

    Esperé un poco antes de responder, desde que asumí que fue hasta su callejón. Y, por supuesto, dar una buena respuesta con fotos bonitas! Uno pequeñeces: lastEdge es en realidad edges(end); no es necesario extraerlos de los ejes de los límites. +1 de todos modos para una solución más bonita que la mía (me gusta la rectángulos), aunque me gustaría colocar el texto en la cuenta+0.5.
    gracias por encontrar el último bin error, me fijo… supongo que vale la pena mencionar que en el último bin HISTC cuenta sólo los valores que coinciden con edges(end) exactamente (por eso he combinado los dos últimos papeleras).

    OriginalEl autor Amro

  2. 4

    Primero, crear un histograma con HISTC como sugiere @Itamar Katz. Para hacer los cubos de basura de la misma como con HIST, usted necesita para calcular correctamente bin bordes. A continuación, se puede graficar la distribución y añadir las etiquetas utilizando TEXTO y 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
    +1 exactamente lo que yo estaba pensando, he publicado otra solución en función de su respuesta

    OriginalEl autor Jonas

  3. 1

    Uso histc, que devuelven un índice para cada entrada, a la que bin hizo el ‘otoño’:

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

    A continuación, las muestras por encima de la k-esima de reciclaje es:

    un(bin==k, 1);

    Prestar atención, debe especificar las tolvas de los límites de sí mismo (a diferencia de hist que utiliza el valor medio entre los límites).

    OriginalEl autor Itamar Katz

Dejar respuesta

Please enter your comment!
Please enter your name here