3
votes

I have two vectors, c and d, whose histogram I need to plot side by side in the same figure in matlab. when i do hist(c); hold on; hist(d) the scale changes and I cant see the histogram of c vector. Where am i going wrong? Any help will be appreciated.

4

4 Answers

4
votes

If you want the two to be in the same figure, you could try adjusting the X and Y limits to suit your needs (try help xlim and help ylim). However plotting them in the same figure might not always suit your needs, as a particular plot has to of course maintain a certain limit for X and Y.

If displaying them side by side in different figures would suffice however, you could consider using subplot():

>> A=[1 1 1 2 2];
>> B=[1 2 2 2 2];
>> figure(1);
>> hold on;
>> subplot(1,2,1);
>> hist(A);
>> subplot(1,2,2);
>> hist(B);

Resultant figure:

Notice how the different axis limits are maintained.

2
votes

You can use axis([xmin xmax ymin ymax]) to control the x and y axis and select a range that will display both histograms. Depending on what you want your plot to look like, you may also want to try using nelements = hist(___) to get the number of elements in each bin and then plot them using bar(x,nelements) to control the location of each bar.

1
votes

hist assumes you want to divide the range into 10 equal sized bins by default. If you want to use the same bins for both histograms, first find the range of your values and make a set of bin centers (e.g. binCenters = linspace(min(x), max(x), 15)'), then callhist(x, binCenters)`.

1
votes

I use MATLAB histograms quite frequently and have wrote this small matlab script to plot two histograms (first one red and second blue) in one figure. The script is quite simple but the important thing is that the histograms should be comparable (i.e. equally spaced frequency bins).

function myhist(varargin)
% myhist function to plot the histograms of x1 and x2 in a single figure. 
% This function uses the same xvalue range and same bins to plot the
% histograms, which makes comparison possible. 
if nargin<2
    x1 = cell2mat(varargin(1));
    x2 = x1;
    res = 100;
elseif nargin==2
    x1 = cell2mat(varargin(1));
    if length(cell2mat(varargin(2)))==1
        res = cell2mat(varargin(2));
        x2 = x1;
    else
        x2 = cell2mat(varargin(2));
        res = 100;
    end
elseif nargin>2
    x1 = cell2mat(varargin(1));
    x2 = cell2mat(varargin(2));
    res = cell2mat(varargin(3));
end

if numel(x1)~=length(x1) || numel(x2)~=length(x2)
    error('Inputs must be vectors.')
    return
end

xrangel = max(min(x1),min(x2));
xrangeh = min(max(x1),max(x2));

x1_tmp = x1(x1>=xrangel & x1<=xrangeh);
x2_tmp = x2(x2>=xrangel & x2<=xrangeh);

xbins = xrangel:(xrangeh - xrangel)/res:xrangeh;

hist(x1_tmp,xbins)
hold on 
h = findobj(gca,'Type','patch');
set(h,'FaceColor','r','EdgeColor','w');
hist(x2_tmp,xbins)