using Matlab to plot density contour for scatter plot

Hi guys, I'm trying to use Matlab to plot the density contour for the following scatter plot. The bins will be 1X1 box. Within my limited understanding the density contour should be indicated how many points fall into the bins(correct me if I'm wrong), but I still cannot find a way to do the density plot. Need some help to solve this problem. Thanks!

 채택된 답변

Mike Garrity
Mike Garrity 2015년 6월 30일
Scatter doesn't do any binning. It's showing each individual data element.
Perhaps this approach does what you want?
x = randn(1,1000);
y = randn(1,1000);
n = hist3([x', y']);
pcolor(n)

댓글 수: 4

Hi Mike, thank you for your help. Your answer is pretty close to what I want but what I'm looking for is a contour line(isoline) rather than the shade plot. Just like the following plot(please ignore the red line and green line). You can see there is a contour line on that dot plot.
That's fine, you can use contour on the output of hist3.
There are a couple of issues though. First, hist3 isn't in core MATLAB, it's in the Statistics toolbox. The second is that to get the picture you've got above, you're going to need the locations of the bins that hist3 used. The easiest way to do that is to use the two output arg form:
[n,c] = hist3(...)
That second argument 'c' is a cell array which contains the X & Y coordinates of the centers of the bins. You can pass those into contour. The result would look something like this:
x = randn(1,5000);
y = randn(1,5000);
scatter(x,y,'r.')
hold on
[n,c] = hist3([x', y']);
contour(c{1},c{2},n)
I'll let you add your fit lines.
Thank you Mike, I got what I want. Thank you for your help.
I am commenting on this old post because I am doing a very similar thing, but achieving some unexpected results.
I am making a histogram2 (tile view) of one dataset, which is time samples of two variables. On the same axes I plot a contour of a map which comes from different data (essentially a target map for the time based data which is in the histogram).
The unusual behaviour is that the colour scale of the hist2 appears to be affected by having the contour on the same axes.
If it is noteworthy, I am plotting the contour first, with a solid colour for all contour lines (not using colormap). Then I plot the histogram second.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Walter Roberson
Walter Roberson 2015년 6월 30일
Assuming that your data starts at 0 and contains fractional values and is to be binned by 1 x 1, and that your coordinates are in X and Y,
xidx = 1 + floor(X(:));
maxxoff = max(xidx) - 1;
yidx = 1 + floor(Y(:));
maxyoff = max(yidx) - 1;
counts = accumarray([yidx, xidx], 1); %remember Y corresponds to rows
imagesc(counts, 'XData', 1/2+[0 maxxoff], 'YData', 1/2+[0 maxyoff]);
hold on
contour(1/2+(0:maxxoff), 1/2+(0:maxyoff), counts)
The 1/2 offsets have to do with referencing the centers of the boxes.
Elena De Angelis
Elena De Angelis 2016년 1월 14일
편집: Walter Roberson 2016년 1월 14일
Hi, I'm trying to do the same but my result is not what I expect, could someone tell me please what i'm doing wrong?
x = dNBR_filt_CHANGE;
y = NBR_post_CHANGE;
scatter(x,y,'r.')
hold on
[n,c] = hist3([x, y]);
contour(c{1},c{2},n)

댓글 수: 3

Just in case they are row vectors,
[n,c] = hist3([x(:), y(:)]);
geopap
geopap 2016년 5월 12일
편집: geopap 2016년 5월 12일
I have exactly the same issue and unfortunately this doesn't work. Any other possible solution?
Update: In my case, where x and y are 1-column vectors, the n variable should be n'
Hamdullah OZOGUL
Hamdullah OZOGUL 2018년 2월 1일
편집: Hamdullah OZOGUL 2018년 2월 1일
You just have to transpose the n to have the correct order.
contour(c{1},c{2},n')

댓글을 달려면 로그인하십시오.

Jos? Manuel Amigo
Jos? Manuel Amigo 2017년 11월 11일
편집: Walter Roberson 2023년 2월 8일
PCx = rand(2000,1); PCy = rand(2000,1);
bins = 50; Msize = 10;
[N C] = hist3([PCx,PCy],[bins bins]);
CX = C{1}; CY = C{2};
N2 = N; N2(N2 == 0) = []; Nunique = unique(N2);
colors = jet(length(Nunique));
for i = 1:length(PCx)
if isnan(PCx(i))
PCxnew(i,1) = NaN;
PCynew(i,1) = NaN;
J(i,1) = NaN;
else
whichoneX = find(min(abs(CX - PCx(i))) == abs(CX - PCx(i)));
PCxnew(i,1) = CX(whichoneX(1));
whichoneY = find(min(abs(CY - PCy(i))) == abs(CY - PCy(i)));
PCynew(i,1) = CY(whichoneY(1));
J(i,1) = sub2ind([bins,bins],whichoneX(1),whichoneY(1));
end
end
for i = 1:bins
for j = 1:bins
temp = sub2ind([bins,bins],i,j);
Jthese = find(J == temp);
if ~isempty(Jthese)
Ntemp = N(temp);
Nthis = find(Nunique == Ntemp);
plot(PCx(Jthese),PCy(Jthese),'.','color',colors(Nthis,:),'Markersize',Msize);
hold on;
end
end
end
hold off;

카테고리

도움말 센터File Exchange에서 Contour Plots에 대해 자세히 알아보기

질문:

2015년 6월 30일

편집:

2023년 2월 8일

Community Treasure Hunt

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

Start Hunting!

Translated by