MATLAB Answers

0

How to overlay a scatter plot over an image (png,jpg) with correct marker colors?

Asked by Usman Tahir Virk on 3 Feb 2016
Latest activity Commented on by Walter Roberson
on 13 Jun 2018
I am unable to overlay a scatter plot over a png/jpg format image for correct marker colors. The color of all the markers remain the same somehow. I am doing following.
figure;
imshow('image');
hold on;
scatter(x,y,size,color,'filled');
%color is an array of the same size as x and y and represent the power in this case
hold off;
The result without the image is as follows
The result including the image and incorrect marker color is as follows.
I would greatly appreciate for assistance in this matter. The available solutions in the other answer threads doesn't work in my case unfortunately.

  0 Comments

Sign in to comment.

2 Answers

Answer by Walter Roberson
on 3 Feb 2016
 Accepted Answer

Your "color" array is a vector of values the same length as x and y. That indicates that the actual color is to be interpolated according to caxis and the active color map. caxis by default scales according to all of the data in the axes. When you have the image in the axes as well as the scatter plot, you are potentially changing the range of data in the axes.
If you are happy with the colors at present, then I suggest that you get the File Exchange contribution "freezeColors" and then use
ax = gca();
scatter(ax, x,y,size,color,'filled');
freezeColors(ax);
hold(ax, 'on');
imh = imshow(ax, 'image');
hold(ax, 'off')
uistack(imh, 'bottom')
Note:
If you look carefully at your combined graph that you posted, you will see that your scatter plot is upside down. This is because image() and imagesc() and imshow() helpfully set "axis image" for you, one of the effects of which is to set the axis Ydir property to 'reverse' so that the first row of the image goes into the top of the display and the rows increase downwards -- as opposed to the normal X Y system where the Y increases upwards.
One of the side effects of the order that I show here is that with the "hold on" done before the imshow() command, the YDir property will be held, so that the scatter plot will not be flipped upside down. But that means that the image will be flipped relative to what you would have seen before. You need to decide which coordinate system you want; if you want the image the "usual" way and the scatter plot upside down, then
set(ax, 'YDir', 'reverse')
before the first "hold" call.
When you are combining image and data, it is common to need to read the image into an array with imread() and then to flipud() the array before using imshow() on it, and to not use YDir reverse

  3 Comments

Dear Walter,
Thanks for a detailed answer and a workable solution. It's working great now. However, imshow(ax, 'image') doesn't not take the axis 'ax' as an argument and works just fine without it. Hope to learn more from you in future. Wish you all the best.
Usman

Sign in to comment.


Answer by Ian Hunter on 21 Mar 2018
Edited by Walter Roberson
on 26 Mar 2018

Thanks Walter!
This helped me get a scatter plot on the same axis as my image plot.
When using your suggested library (downloaded today on 3/21/18) with Matlab 2017B, running the code:
figure;
ax = gca();
colormap jet
c = linspace(0,1,length(gridcoords(:,1)));
scatter(ax,(double(gridcoords(:,1)))*double(width)/size(projImg,2),double(gridcoords(:,2))*(double(height)/size(projImg,1)),[],c,'filled'); %,[],c);
freezeColors(ax);
hold(ax,'on');
imh = imshow((double(imT)/255.0 + double(projImResized(:,:,3)) )/2.0);
hold(ax, 'off')
uistack(imh, 'bottom')
The freezeColors(ax) command returns the err:
Error using matlab.graphics.chart.primitive.Scatter/set
Error setting property 'CData' of class 'Scatter':
Value must be a scalar, vector or array of numeric type
Error in freezeColors (line 157)
set(hh,'CData',realcolor);
Error in GUI_rectangle_bdygradient/recVid_callback (line 310)
freezeColors(ax);
Error while evaluating UIControl Callback.
The only factor besides freezeColors no longer working as you figured include:
1. I have defined c and colormap in a way incompatible with freezeColors
2. I am using this within a GUI in a static environment.
Thanks for your help thus far. If you have any further ideas, I'd be a thankful person.
Cheers,
Ian

  2 Comments

This is a bug in freezeColors for scatter plots. I have written the author with an explanation of the problem.

Sign in to comment.