Plot 2D-histogram for X and Y
118 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
BN
el 20 de Jul. de 2020
Editada: Alessandro Maria Laspina
el 20 de Jul. de 2022
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:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334454/image.jpeg)
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):
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334457/image.jpeg)
So any suggestion is really helpful.
Thank you all
3 comentarios
Roger J
el 20 de Jul. de 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.
Respuesta aceptada
Star Strider
el 20 de Jul. de 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:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334482/image.png)
Experiment to get different results.
.
3 comentarios
Alessandro Maria Laspina
el 20 de Jul. de 2022
Editada: Alessandro Maria Laspina
el 20 de Jul. de 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
Más respuestas (3)
Cris LaPierre
el 20 de Jul. de 2020
Editada: Cris LaPierre
el 20 de Jul. de 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.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334491/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334494/image.png)
Try adding (and adjusting to meet your needs) the following code.
colormap("jet")
caxis([0,80])
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334500/image.png)
Image Analyst
el 20 de Jul. de 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)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/334497/image.png)
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?
1 comentario
Steven Lord
el 20 de Jul. de 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.
Ver también
Categorías
Más información sobre Data Distribution Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!