Plot 2D-histogram for X and Y
118 次查看(过去 30 天)
显示 更早的评论
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 个评论
Roger J
2020-7-20
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
2020-7-20
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 个评论
Alessandro Maria Laspina
2022-7-20
编辑:Alessandro Maria Laspina
2022-7-20
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
更多回答(3 个)
Cris LaPierre
2020-7-20
编辑:Cris LaPierre
2020-7-20
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
2020-7-20
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?
Steven Lord
2020-7-20
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Data Distribution Plots 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!