MATLAB: Shift horizontal histogram to right

curvehistogrammarginalpdfplotprobability densityvertical

I am trying to shift the entire histogram to right, i.e. at 0.04 instead of 0, without changing the xticks.

Best Answer

Here's a demo that shows how to compute a probability density estimate for each column of data and how to plot the PDF curve next to each column of data. See inline comments for details.
% Produce a matrix of data where each column of y contains
% data for each vertical stack of dots with x-coordinates
% defined by x.
x = 0:5:50;
y = (randn(50, numel(x)) + linspace(.5,5,numel(x))) .* linspace(.5,2,numel(x));
% Plot the data
plot(x, y, 'bo')
% Compute the probability density estimates (pdfx) for each column of y
nSets = size(y,2);
nPoints = 1000;
points = linspace(min(y(:)), max(y(:)), nPoints);
pdfx = cell2mat(arrayfun(@(col){ksdensity(y(:,col),points)'}, 1:nSets));
% Compute the interval between the x-values
xInterval = mean(diff(x)); % ie, = 5
% Normalize results so that all pdf values are
% between 0 and 85% of the x-interval while maintaining
% the relative heights across all pdf curves.
pdfxNorm = (pdfx - min(pdfx,[],'all')) * (xInterval*.85/range(pdfx(:)));
% NOTE: if you want each pdf curve's height to be independent
% and *not* maintaining the relative hights across all pdf
% curves, use this line instead:
% pdfxNorm = (pdfx - min(pdfx,[],1)) .* (xInterval*.85./range(pdfx,1));
% Horizontally offset the pdfxNorm values so each column
% corresponds to an associated x-value.
pdfxShift = pdfxNorm - min(pdfxNorm,[],1) + x;
% Compute y-values for the pdf curves so that the
% curves do not extend beyond the range of the
% data within each column.
pdfYvals = repmat(points(:),1,size(pdfxShift,2));
pdfYvals(pdfYvals < min(y, [], 1) | pdfYvals > max(y, [], 1)) = NaN;
% Add PDFs to plot
axis tight
xlim([min(x), max(x)+xInterval])
hold on
plot(pdfxShift, pdfYvals, 'r-')
grid on
Here's an example of independent-height option for the pdfxNorm variable, using different random data.