% thumbnailScatter.m
% MATLAB script that plots thumbnails over datapoints
%
% Derya Akkaynak
%
% Massachusetts Institute of Technology
% March 4, 2013
%
% for questions/comments/bugs: deryaa@mit.edu
function thumbnailScatter(dataX,dataY,thumbnailPath)
% dataX is a vector of size 1xN (or Nx1)
% dataY is a vector of size 1xN (or Nx1)
% thumbnailPath is where the thumbnails that will be overlaid onto the data
% poits are stored.
%
% the script expects the thumbnails to be named thumb1.jpg, thumb2.jpg, but
% you can change the names as needed. The only requirement is that the thumbnails
% align with the data points. For example, [dataX(5),dataY(5)] is
% represented by thumb5.jpg.
%
% You should also provide a mask for the alphamap of your images (if
% needed). These should be from files named, e.g., 'mask5.mat'. Or change as
% needed.
sX = numel(dataX);
sY = numel(dataY);
assert(sX==sY,'There must be the same number of points in both input vectors');
% this part draws the main plot underneath. change dimensions as needed.
mainFig = figure;
set(mainFig,'position',[100 600 1000 1000]) % change these dimensions as needed
set(mainFig,'resize','off') % if resized, the images don't sit on the correct coords
hold on
plot(dataX,dataY,'k.')
xlabel('Test Data XYZ','fontsize',20)
ylabel('Change of test Data XYZ','fontsize',20)
mainAxes = gca; % this is the handle to the plot
curPos = get(mainAxes,'position');
xlims = get(mainAxes,'xlim');
ylims = get(mainAxes,'ylim');
sx = 0.08; % size of the "image" to be overlaid, this can be changed
sy = 0.08;
xoffset = sx./3; % offsets to place the axes over the point exactly
yoffset = sy./3; % these may be changed if image is resized
for i = 1:sX
loc = [dataX(i) dataY(i)];
% read the thumbnail to be plotted over the data point
img = imread([thumbnailPath,'/thumb',num2str(i),'.jpg']); % change this as needed
sImg = size(img);
% read the mask that will cut the excess/unwanted area in the img
% if the mask is the same for all images, this may be taken outside the
% loop
load([thumbnailPath,'/mask',num2str(i),'.mat'],'mask');
sMask = size(mask);
if (sImg(1) ~=sMask(1)) || (sImg(2) ~=sMask(2))
mask = imresize(mask,[sImg(1) sImg(2)]);
end
pos = [curPos(1) + curPos(3) * (loc(1) - xlims(1)) / (xlims(2) - xlims(1)),...
curPos(2) + curPos(4) * (loc(2) - ylims(1)) / (ylims(2) - ylims(1))];
imgAxes = axes('position',[pos(1) - xoffset pos(2)- yoffset sx sy]);
hold on
himg = imshow(uint8(img),'Parent',imgAxes);
set(himg, 'AlphaData', mask*1);
end