# Plot 2D-histogram for X and Y

692 views (last 30 days)
BN on 20 Jul 2020
Dear all,
I have two types of data sets (X and Y) with equal size, which I would like to plot 2D-histogram of them, in order to compare X by Y.
So the larger the scatter implies the greater
disagreement.
I used this script below:
data = [X,Y];
hist3(data,'CdataMode','auto')
xlabel('observed')
ylabel('modeled')
colorbar
view(2)
And here is my achievement:
Unfortunately, as you can see this plot does not represent my goal, for instance, please look at this figure below (I want to achieve a plot like this below):
So any suggestion is really helpful.
Thank you all
Roger J on 20 Jul 2020
Try:
>> hist(X)
>> hist(Y)
I did, and it plotted each vector, and most(almost all) of your data is less than 50 for both X and Y. Seems like the histogram is correct for that data.

Star Strider on 20 Jul 2020
Try this:
X = D1.X;
Y = D2.Y;
data = [X,Y];
hh3 = hist3(data, 'Nbins',[1 1]*60);
figure
image(flipud(hh3))
ax = gca;
xt = ax.XTick;
yt = ax.YTick;
ax.XTickLabel = xt*10;
set(ax, 'YTick',[0 yt], 'YTickLabel', [flip([0 yt])]*10)
producing:
Experiment to get different results.
.
Alessandro Maria Laspina on 20 Jul 2022
Edited: Alessandro Maria Laspina on 20 Jul 2022
How would I do this but with log scales on the x and y axis (assuming no negative or 0 values)? If I use set(gca,'Yscale','log') it leaves a blank space

Cris LaPierre on 20 Jul 2020
Edited: Cris LaPierre on 20 Jul 2020
A couple issues to be aware of.
1. You are using a different colormap. It looks like the goal image is using Jet.
2. Your X and Y values are dominated by the counts in the first bin (histograms below). Consider using caxis to keep the colorbar focused on the desired range.
colormap("jet")
caxis([0,80])
BN on 29 Jul 2020
Thank you so much +1

Image Analyst on 20 Jul 2020
Your data does not peak in the 100 to 250 range. It peaks around 0:
data = [X,Y];
h = histogram2(X, Y,100)
xlabel('observed')
ylabel('modeled')
% Set colormap, but it won't have any effect.
colormap(jet(256));
colorbar;
% view(2)
% Zoom in on the 0-200 range.
xlim([0,200]);
ylim([0,200]);
% Label the plot.
title('Counts', 'FontSize', 20);
xlabel('X', 'FontSize', 20);
ylabel('Y', 'FontSize', 20);
coefficients = polyfit(X, Y, 1);
xFit = xlim;
yFit = polyval(coefficients, xFit);
hold on;
plot3(xFit, yFit, [0,0], 'r-', 'LineWidth', 3);
c = corrcoef(X, Y)
This is essentially just what you saw, just that I used narrower bins and used a more modern function: histogram2(). Why do you think it's wrong and that you should have more counts in the 100-250 range?
BN on 29 Jul 2020
Edited: BN on 29 Jul 2020
Yes you right, Thank you so much. +1

Steven Lord on 20 Jul 2020
In addition to histogram2 which Image Analyst suggested, take a look at the heatmap function. I think showing a heatmap of the data binned by histogram2 or histcounts2 will be pretty close to the picture you want.
BN on 29 Jul 2020
Yest Thank you so much +1

### Categories

Find more on Data Distribution Plots in Help Center and File Exchange

R2020a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!