0
votes

I've made a plot of 10 points

10 10 248,628959661970 66,9462583977501 451,638770451973 939,398361884535 227,712826026548 18,1775336366957 804,449583613070 683,838613746355 986,104241895970 783,736480083219 29,9919502693899 534,137567882728 535,664190667238 885,359450931142 87,0772199008924 899,004898906140 990 990

With the first column as x-coordinates and the other column as y-coordinates

Leading to the following Plot: Using the following code: scatter(Problem.Points(:,1),Problem.Points(:,2),'.b') Plot

I then also calculated the euclidean distances using Problem.DistanceMatrix = pdist(Problem.Points); Problem.DistanceMatrix = squareform(Problem.DistanceMatrix);

I replaced the distances by 1*10^6 when they are larger than a certain value. This lead to the following table:

Euclidean distances

Then, I would like to plot the lines between the corresponding points, preferably with their distances, but only in case the distance < 1*10^6.

Specifically i want to plot the line [1,2] [1,4] [1,7] [2,4] etc.

My question is, can this be done and how?

3
(1) Can you be more specific about what you mean when you say you would like to "plot the lines," e.g. produce a line plot where each column of the table is a line, or produce a heatmap? In general, if D is a matrix then you can exclude values of D over max_value from a plot by replacing them by NaNs as follows: D(D > max_value) = NaN;. (2) Could you also include your code so we can replicate it exactly?verbatross
I just want to clarify. You would like to draw lines, on the same scatter plot between all of the points that are below you 1e6 criteria?user9985

3 Answers

2
votes

Assuming one set of your data is in something called xdata and the other in ydata and then the distances in distances, the following code should accomplish what you want.

hold on
for k = 1:length(xdata)
    for j = 1:length(ydata)
        if(distances(k,j) < 1e6)
            plot([xdata(k) xdata(j)], [ydata(k) ydata(j)]);
        end
    end
end

You just need to iterate through your matrix and then if the value is less than 1e6, then plot the line between the kth and jth index points. This will however double plot lines, so it will plot from k to j, and also from j to k, but it is quick to code and easy to understand. I got the following plot with this.

enter image description here

1
votes

This should do the trick:

P = [
    10.0000000000000  10.0000000000000;
   248.6289596619700  66.9462583977501;
   451.6387704519730 939.3983618845350;
   227.7128260265480  18.1775336366957;
   804.4495836130700 683.8386137463550;
   986.1042418959700 783.7364800832190;
    29.9919502693899 534.1375678827280;
   535.6641906672380 885.3594509311420;
    87.0772199008924 899.0048989061400;
   990.0000000000000 990.0000000000000
];
P_len = size(P,1);

D = squareform(pdist(P));
D(D > 600) = 1e6;

scatter(P(:,1),P(:,2),'*b');

hold on;

for i = 1:P_len
    pi = P(i,:);

    for j = 1:P_len
        pj = P(j,:);
        d = D(i,j);

        if ((d > 0) && (d < 1e6))
            plot([pi(1) pj(1)],[pi(2) pj(2)],'-r');
        end
    end
end

hold off;

Final output:

Output

On a side note, the part in which you replaces the distance values trespassing a certain treshold (it looks like it's 600 by looking at your distances matrix) with 1e6 can be avoided by just inserting that threshold into the loop for plotting the lines. I mean... it's not wrong, but I just think it's an unnecessary step.

D = squareform(pdist(P));

% ...

if ((d > 0) && (d < 600))
    plot([pi(1) pj(1)],[pi(2) pj(2)],'-r');
end
0
votes

A friend of mine suggested using gplot

gplot(Problem.AdjM, Problem.Points(:,:), '-o')

With problem.points as the coordinates and Problem.AdjM as the adjacency matrix. The Adjacency matrix was generated like this:

Problem.AdjM=Problem.DistanceMatrix;
Problem.AdjM(Problem.AdjM==1000000)=0;
Problem.AdjM(Problem.AdjM>0)=1;

Since the distances of 1*10^6 was the replacement of a distance that is too large, I put the adjacency there to 0 and all the other to 1.

This lead to the following plot, which was more or less what I wanted:

Points Linked Together

Since you people have been helping me in such a wonderful way, I just wanted to add this:

I added J. Mel's solution to my code, leading to two exactly the same figures: My solution J Mel's solution

Since the figures get the same outcome, both methods should be all right. Furthermore, since Tommasso's and J Mel's outcomes were equal earlier, Tommasso's code must also be correct.

Many thanks to both of you and all other people contributing!