Shifting by some small amount to increase visibility is (probably) a bad idea...
- Introduces inaccuracies to your plot
- May not actually make things much clearer
A better option would be to use concentric circles, by varying the point size using scatter.
% Set up matrix for plotting
m = [0, 12, 7, 10, 0, 12;
0, 7, 7, 10, 0, 7 ;
7, 12, -3, 0, 7, 7 ;
0, 10, 4, 0, 7, 10];
x = 1:size(m,2);
% Unique elements in the matrix (could use tolerancing here)
u = unique(m);
% Set up sizes of each point
s = zeros(size(m));
for ii = 1:numel(u);
c = cumsum(m == u(ii),1); % Running total of matching value in columns
s = s + c.*(m == u(ii)); % Increase point size by number of points
end
s = (s*5).^2; % Scatter takes square-points size, times 5 for scale
% Plot each row
figure; hold on;
for jj = 1:size(m,1)
scatter(x, m(jj,:), s(jj,:), 'linewidth', 1.25); % Using the sizes we just made
end
hold off; grid on; xlim([0,7]);
Output:

This method has the advantage of immediately seeing "hotspots" in your data where there are many points. Also, whilst the colours are more visible, colours aren't necessary for reading the plot. This is convenient when working with greyscale print-outs or colleagues with colour-blindness.
A similar but alternative method would be to give each row its own size, then the size/colour is consistent. You just don't get the "hotspots" and you may get a large circle with no smaller ones inside it - making it harder to see the actual data point location.