Kiarash
Kiarash

Reputation: 7998

How to overlay histograms in matlab

I have multiple histograms that I would like to overlay on top of each other but I don't know how to do it. I found the code below but I don't know how to modify it to run on a loop instead of just two histograms.

data1 = randn(100,1);       % data of one size
data2 = randn(25, 1);       % data of another size!

myBins = linspace(-3,3,10); % pick my own bin locations

% Hists will be the same size because we set the bin locations:
y1 = hist(data1, myBins);   
y2 = hist(data2, myBins);

% plot the results:
figure(3);
bar(myBins, [y1;y2]');
title('Mixed size result');

enter image description here

or what is a better way of comparing histograms if they are more than 10 or 20.

Upvotes: 2

Views: 10953

Answers (5)

Marc
Marc

Reputation: 3313

it's much easier now:

histogram(data1, myBins);
hold on;   
histogram(data2, myBins);

Upvotes: 2

Evgeni Sergeev
Evgeni Sergeev

Reputation: 23593

Here's a way that was useful to me:

enter image description here

I'm plotting a histogram for each column of the matrix ao.

The code was:

    for i = 1:size(ao,2)
        [h, y] = hist(ao(:,i), linspace(-5,10,100));
        h = i + (0.95./max(h(:))) .* h;
        barh(y, h, 'BarWidth', 1, 'BaseValue', i, 'LineStyle', 'none');
        hold on;
    end
    grid;

Note that just changing barh to bar will give the same thing but going up-down instead of left-right (i.e. the figure rotated by 90° anti-clockwise).

Upvotes: 0

Luis Mendo
Luis Mendo

Reputation: 112689

I would suggest this. It's simple and does not require for loops:

bar([y1.' y2.'],'stacked')

Upvotes: 0

bdecaf
bdecaf

Reputation: 4732

Your question is very general. Firstly I do not understand why you insist on a for loop.

Personally I don't like the included bar plot. It quickly gets messy (especially since the bars are not at the "original" location)

If you got a lot of histograms I would consider a stairstep plot as it doesn't fill the plot area so much. Or you could come up with your own - eg using transparent patches.

If it get's lots of curves there are many ways to visualize them google for "multivariate visualization" and be amazed. One of the most amusing ways would be Chernoff faces.

Upvotes: 2

rascob
rascob

Reputation: 463

You could do the following, although it's not the only way:

data = cell(1, N);
y = cell(1, N);
yBar = zeros(N, 10);
for i=1:N
    data{1, i} = randn(10*round(rand(1,1)), 1);
    y{1, i} = hist(data{1, i}, myBins);
    yBar(i, :) = y{1, i};
end
yBar = yBar';
figure(3);
bar(myBins, yBar);
title('Mixed size result');

Using the y cell is not obligatory of course, I left it there to actually show what's happening.

Upvotes: 0

Related Questions