Changing the colour intensity of a 2D plot
Ältere Kommentare anzeigen
Hi,
I'm plotting lat long data on a map like this.
I'm using the plotm() function:
plotm(x,y,'LineStyle','none','Marker','o','MarkerSize',20);

I'm trying to change the colours so that areas with more data are a different colour. I would like the intensity of the colour to change with the amount of data points.
Would anybody know how I could achieve this?
Thanks
Antworten (2)
Walter Roberson
am 26 Dez. 2012
0 Stimmen
plotm() cannot have different colors within any one line (column of data).
There are tricks for using patch() for drawing very narrow lines.
It appears to me that your data is sufficiently dense that you could use scatterm() and have the output look relatively continuous. scatterm() accepts a matrix of colors, one RGB row per point.
11 Kommentare
John
am 26 Dez. 2012
Walter Roberson
am 26 Dez. 2012
[ux, uxa, uxb] = unique(x);
[uy, uya, uyb] = unique(y);
counts = accumarray( [uxb(:), uyb(:)], 1 );
maxcount = max(counts(:));
relative_counts = counts(sub2ind(size(counts), uxb, uyb)) ./ maxcount;
rgbarray = [zeros(length(x), 2), relative_counts(:)];
pointsize = 10; %adjust as needed
scatterm( x, y, pointsize, rgbarray );
John
am 26 Dez. 2012
John
am 11 Jan. 2013
Walter Roberson
am 11 Jan. 2013
Could I ask you to post an image of
hist(relative_counts, 32)
also, could you show
mean(relative_counts)
std(relative_counts)
size(relative_counts)
John
am 12 Jan. 2013
Walter Roberson
am 12 Jan. 2013
That's fairly badly skewed.
I'm not sure how well it will work for display purposes, but try
rgbarray = [zeros(length(x), 2), relative_counts(:).^(1/4)];
I worry that this will be fairly deceptive about relative values.
Image Analyst
am 13 Jan. 2013
J - you're not interested in the imaging method I guess. It's just 6 lines of code lines, starting from your x,y coordinates. Upload your x,y data somewhere if you need more help than my code below.
John
am 14 Jan. 2013
Walter Roberson
am 14 Jan. 2013
What I think I would suggest at this point is to use interp1() on relative_counts, using a look-up table that emphasized the low values but still had high values. For example,
mapval = interp1( 0:.1:1, [0 .3 .5 .7 .725 .75 .775 .8 .825 .9 1], relative_counts);
rgbarray = [zeros(length(x), 2), mapval(:)];
You would adjust the first parameter (possibly unevenly) according to where you wanted the intensity boundaries to be, and would adjust the second parameter according to the percentage blue you wanted each range to show up with.
Image Analyst
am 26 Dez. 2012
Bearbeitet: Image Analyst
am 13 Jan. 2013
If you treat it as an image you could do that, with some work. You could run the thing through a convolution, conv2(). This would give you a higher signal where the roads are more dense. Essentially that is an indexed image. Then you apply a colormap to it, and call ind2rgb to turn it into a color image. Then you use the roads as a mask over the color image so that roads in concentrated areas show up as a different color than roads in sparse areas. Hopefully that described it enough for you to carry out the code. Though I think this representation would be very confusing and distracting to look at.
for k = 1 : length(x)
yourImage(round(y(k)), round(x(k)) = 1;
end
densityImage = conv2(yourImage, ones(5)/25, 'same');
imshow(densityImage, []);
colormap(jet(256));
6 Kommentare
John
am 14 Jan. 2013
Image Analyst
am 14 Jan. 2013
I couldn't get your links to work, but if you got something working with Walter's code, then just go with it.
John
am 14 Jan. 2013
Image Analyst
am 14 Jan. 2013
Can you upload the image? The fig file is no good to me. But I'm not sure how the x,y would correspond to pixels. I don't have the mapping toolbox so I'd probably have to calibrate the x,y to pixel row,column locations.
John
am 16 Jan. 2013
Hello Image Analyst,
I am not using the mapping toolbox to source the image. I am using this file on the file exchange to retrieve the map and then I just overlay the data on it. I code I use is below:
latlim = [53.0 53.6];
lonlim = [-6.5 -6];
figure
axis([lonlim, latlim])
axis image
plot_google_map
hold on
plot(x,y,'LineStyle','none','Marker','.','MarkerSize',3);
The x and y data (GPS) is in this file.
Would your method be possible with this setup?
Thank you
An example:

John
am 19 Jan. 2013
Kategorien
Mehr zu Blue finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!