307 views (last 30 days)

Show older comments

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:

D1 = load('X.mat');

D2 = load('Y.mat');

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.

.

Cris LaPierre
on 20 Jul 2020

Edited: Cris LaPierre
on 20 Jul 2020

A couple issues to be aware of.

- You are using a different colormap. It looks like the goal image is using Jet.
- 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.

Try adding (and adjusting to meet your needs) the following code.

colormap("jet")

caxis([0,80])

Image Analyst
on 20 Jul 2020

Your data does not peak in the 100 to 250 range. It peaks around 0:

load('x.mat');

load('y.mat');

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?

Steven Lord
on 20 Jul 2020

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

Start Hunting!