ListPlot join points by nearest neighbor rather than order Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Interpolation on large 2D list results in erratic functionHow can I combine several 2D-plots to one big 3D plot?ListContourPlot3D blank box?Does anyone know a way to draw lines connecting nearest neighbor points in ListPlot[ ]?PlotRange->Automatic the exact function used to calculate outliersI need help on plotting surface through my list of data pointsHow do I make ListPlot join the points in order?ListContourPlot not plotting all data pointsMathematica returns a blank coordinate system when I try to plot dataMore resolution on ListContourPlot?

How to deal with a team lead who never gives me credit?

List numbering with letters

When is phishing education going too far?

Compressing georeferenced images

Marking the functions of a sentence: 'She may like it'

How does a biquinary adder work?

What causes the vertical darker bands in my photo?

Can a drone be seen on TCAS?

Are my PIs rude or am I just being too sensitive?

Withdrew £2800, but only £2000 shows as withdrawn on online banking; what are my obligations?

Why was the term "discrete" used in discrete logarithm?

Is it true that "carbohydrates are of no use for the basal metabolic need"?

Java 8 stream max() function argument type Comparator vs Comparable

What makes black pepper strong or mild?

Why there are no cargo aircraft with "flying wing" design?

3 doors, three guards, one stone

Do I really need recursive chmod to restrict access to a folder?

How to recreate this effect in Photoshop?

Is above average number of years spent on PhD considered a red flag in future academia or industry positions?

What LEGO pieces have "real-world" functionality?

Bonus calculation: Am I making a mountain out of a molehill?

Models of set theory where not every set can be linearly ordered

Does surprise arrest existing movement?

Why don't the Weasley twins use magic outside of school if the Trace can only find the location of spells cast?



ListPlot join points by nearest neighbor rather than order



Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?Interpolation on large 2D list results in erratic functionHow can I combine several 2D-plots to one big 3D plot?ListContourPlot3D blank box?Does anyone know a way to draw lines connecting nearest neighbor points in ListPlot[ ]?PlotRange->Automatic the exact function used to calculate outliersI need help on plotting surface through my list of data pointsHow do I make ListPlot join the points in order?ListContourPlot not plotting all data pointsMathematica returns a blank coordinate system when I try to plot dataMore resolution on ListContourPlot?










4












$begingroup$


I have found some software that allows me to "data mine" the values from publication figures. I have a bunch of contours from papers that I've mined using this software, and am having some trouble plotting the points with the Joined command.



Unfortunately, the downloaded points are sorted by increasing x values, which makes the plotting of Gaussian-esque contours very difficult. I've searched around the forums and haven't found anyone mentioning this problem.



Here's an example on a very small, simpler distribution (note my other sets are much larger so brute force definitely won't work.)



data=62.0774, 0.598737, 62.2377, 0.619119, 62.4048, 
0.580509, 62.5466, 0.637818, 62.9276, 0.654518, 62.9668,
0.566973, 63.3095, 0.671261, 63.8137, 0.688518, 63.8913,
0.565805, 64.4067, 0.703821, 64.8157, 0.568541, 65.1005,
0.718671, 65.7401, 0.573603, 65.9282, 0.732056, 66.6646,
0.580678, 66.7973, 0.743456, 67.6058, 0.589303, 67.7571,
0.755602, 68.5512, 0.599853, 68.6815, 0.761419, 69.4,
0.614478, 69.6059, 0.76384, 70.1679, 0.631668, 70.5117,
0.759937, 70.5514, 0.759266, 70.7216, 0.649606, 71.3609,
0.666955, 71.3764, 0.751005, 71.7909, 0.736308, 71.8078,
0.687055, 71.947, 0.702022, 72.0491, 0.717738


Using ListPlot gives me this:



ListPlot[data]


points



While using ListLinePlot gives me this



ListLinePlot[data]


lines



because the points are ordered with increasing x-value.



So, is there any way to either join the points by nearest neighbor, or re-order the list such that the joined command will give me a neat line? This seems like a traveling-salesman type problem, which could quickly get slow as I increase the number of points too much.










share|improve this question











$endgroup$







  • 3




    $begingroup$
    Try FindShortestTour
    $endgroup$
    – C. E.
    8 hours ago






  • 2




    $begingroup$
    Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
    $endgroup$
    – J42161217
    7 hours ago






  • 1




    $begingroup$
    Will your data always be in convex hulls?
    $endgroup$
    – MikeY
    3 hours ago










  • $begingroup$
    @MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
    $endgroup$
    – zack
    1 hour ago















4












$begingroup$


I have found some software that allows me to "data mine" the values from publication figures. I have a bunch of contours from papers that I've mined using this software, and am having some trouble plotting the points with the Joined command.



Unfortunately, the downloaded points are sorted by increasing x values, which makes the plotting of Gaussian-esque contours very difficult. I've searched around the forums and haven't found anyone mentioning this problem.



Here's an example on a very small, simpler distribution (note my other sets are much larger so brute force definitely won't work.)



data=62.0774, 0.598737, 62.2377, 0.619119, 62.4048, 
0.580509, 62.5466, 0.637818, 62.9276, 0.654518, 62.9668,
0.566973, 63.3095, 0.671261, 63.8137, 0.688518, 63.8913,
0.565805, 64.4067, 0.703821, 64.8157, 0.568541, 65.1005,
0.718671, 65.7401, 0.573603, 65.9282, 0.732056, 66.6646,
0.580678, 66.7973, 0.743456, 67.6058, 0.589303, 67.7571,
0.755602, 68.5512, 0.599853, 68.6815, 0.761419, 69.4,
0.614478, 69.6059, 0.76384, 70.1679, 0.631668, 70.5117,
0.759937, 70.5514, 0.759266, 70.7216, 0.649606, 71.3609,
0.666955, 71.3764, 0.751005, 71.7909, 0.736308, 71.8078,
0.687055, 71.947, 0.702022, 72.0491, 0.717738


Using ListPlot gives me this:



ListPlot[data]


points



While using ListLinePlot gives me this



ListLinePlot[data]


lines



because the points are ordered with increasing x-value.



So, is there any way to either join the points by nearest neighbor, or re-order the list such that the joined command will give me a neat line? This seems like a traveling-salesman type problem, which could quickly get slow as I increase the number of points too much.










share|improve this question











$endgroup$







  • 3




    $begingroup$
    Try FindShortestTour
    $endgroup$
    – C. E.
    8 hours ago






  • 2




    $begingroup$
    Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
    $endgroup$
    – J42161217
    7 hours ago






  • 1




    $begingroup$
    Will your data always be in convex hulls?
    $endgroup$
    – MikeY
    3 hours ago










  • $begingroup$
    @MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
    $endgroup$
    – zack
    1 hour ago













4












4








4


1



$begingroup$


I have found some software that allows me to "data mine" the values from publication figures. I have a bunch of contours from papers that I've mined using this software, and am having some trouble plotting the points with the Joined command.



Unfortunately, the downloaded points are sorted by increasing x values, which makes the plotting of Gaussian-esque contours very difficult. I've searched around the forums and haven't found anyone mentioning this problem.



Here's an example on a very small, simpler distribution (note my other sets are much larger so brute force definitely won't work.)



data=62.0774, 0.598737, 62.2377, 0.619119, 62.4048, 
0.580509, 62.5466, 0.637818, 62.9276, 0.654518, 62.9668,
0.566973, 63.3095, 0.671261, 63.8137, 0.688518, 63.8913,
0.565805, 64.4067, 0.703821, 64.8157, 0.568541, 65.1005,
0.718671, 65.7401, 0.573603, 65.9282, 0.732056, 66.6646,
0.580678, 66.7973, 0.743456, 67.6058, 0.589303, 67.7571,
0.755602, 68.5512, 0.599853, 68.6815, 0.761419, 69.4,
0.614478, 69.6059, 0.76384, 70.1679, 0.631668, 70.5117,
0.759937, 70.5514, 0.759266, 70.7216, 0.649606, 71.3609,
0.666955, 71.3764, 0.751005, 71.7909, 0.736308, 71.8078,
0.687055, 71.947, 0.702022, 72.0491, 0.717738


Using ListPlot gives me this:



ListPlot[data]


points



While using ListLinePlot gives me this



ListLinePlot[data]


lines



because the points are ordered with increasing x-value.



So, is there any way to either join the points by nearest neighbor, or re-order the list such that the joined command will give me a neat line? This seems like a traveling-salesman type problem, which could quickly get slow as I increase the number of points too much.










share|improve this question











$endgroup$




I have found some software that allows me to "data mine" the values from publication figures. I have a bunch of contours from papers that I've mined using this software, and am having some trouble plotting the points with the Joined command.



Unfortunately, the downloaded points are sorted by increasing x values, which makes the plotting of Gaussian-esque contours very difficult. I've searched around the forums and haven't found anyone mentioning this problem.



Here's an example on a very small, simpler distribution (note my other sets are much larger so brute force definitely won't work.)



data=62.0774, 0.598737, 62.2377, 0.619119, 62.4048, 
0.580509, 62.5466, 0.637818, 62.9276, 0.654518, 62.9668,
0.566973, 63.3095, 0.671261, 63.8137, 0.688518, 63.8913,
0.565805, 64.4067, 0.703821, 64.8157, 0.568541, 65.1005,
0.718671, 65.7401, 0.573603, 65.9282, 0.732056, 66.6646,
0.580678, 66.7973, 0.743456, 67.6058, 0.589303, 67.7571,
0.755602, 68.5512, 0.599853, 68.6815, 0.761419, 69.4,
0.614478, 69.6059, 0.76384, 70.1679, 0.631668, 70.5117,
0.759937, 70.5514, 0.759266, 70.7216, 0.649606, 71.3609,
0.666955, 71.3764, 0.751005, 71.7909, 0.736308, 71.8078,
0.687055, 71.947, 0.702022, 72.0491, 0.717738


Using ListPlot gives me this:



ListPlot[data]


points



While using ListLinePlot gives me this



ListLinePlot[data]


lines



because the points are ordered with increasing x-value.



So, is there any way to either join the points by nearest neighbor, or re-order the list such that the joined command will give me a neat line? This seems like a traveling-salesman type problem, which could quickly get slow as I increase the number of points too much.







plotting order






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 21 mins ago









Carl Woll

74.2k398193




74.2k398193










asked 8 hours ago









zackzack

786




786







  • 3




    $begingroup$
    Try FindShortestTour
    $endgroup$
    – C. E.
    8 hours ago






  • 2




    $begingroup$
    Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
    $endgroup$
    – J42161217
    7 hours ago






  • 1




    $begingroup$
    Will your data always be in convex hulls?
    $endgroup$
    – MikeY
    3 hours ago










  • $begingroup$
    @MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
    $endgroup$
    – zack
    1 hour ago












  • 3




    $begingroup$
    Try FindShortestTour
    $endgroup$
    – C. E.
    8 hours ago






  • 2




    $begingroup$
    Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
    $endgroup$
    – J42161217
    7 hours ago






  • 1




    $begingroup$
    Will your data always be in convex hulls?
    $endgroup$
    – MikeY
    3 hours ago










  • $begingroup$
    @MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
    $endgroup$
    – zack
    1 hour ago







3




3




$begingroup$
Try FindShortestTour
$endgroup$
– C. E.
8 hours ago




$begingroup$
Try FindShortestTour
$endgroup$
– C. E.
8 hours ago




2




2




$begingroup$
Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
$endgroup$
– J42161217
7 hours ago




$begingroup$
Try something like ListLinePlot[data[[Last@FindShortestTour@data]]] but it is not perfect
$endgroup$
– J42161217
7 hours ago




1




1




$begingroup$
Will your data always be in convex hulls?
$endgroup$
– MikeY
3 hours ago




$begingroup$
Will your data always be in convex hulls?
$endgroup$
– MikeY
3 hours ago












$begingroup$
@MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
$endgroup$
– zack
1 hour ago




$begingroup$
@MikeY unfortunately not! They are the results of a Bayesian analysis and many have differing, strange, and non-analytical forms.
$endgroup$
– zack
1 hour ago










3 Answers
3






active

oldest

votes


















7












$begingroup$

You can use FindCurvePath to reorder your data. However, FindCurvePath expects the scale of the two coordinates to be close, so you need to rescale first:



new = FindCurvePath[data . 1, 0, 0, 100]
ListLinePlot[data[[#]]& /@ new]



2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29,
28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




enter image description here



Update



Roman suggested automating the scaling of the data. Here is one possibility for rescaling the data:



rescale = RescalingTransform[CoordinateBounds[data]] @ data;


Then, using FindCurvePath on the rescaled data:



new = FindCurvePath @ rescale



2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25,
24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




produces the same result.






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Why not just the closely related ListCurvePathPlot?
    $endgroup$
    – Roman
    6 hours ago






  • 1




    $begingroup$
    @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
    $endgroup$
    – Carl Woll
    5 hours ago






  • 1




    $begingroup$
    Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
    $endgroup$
    – Roman
    4 hours ago







  • 1




    $begingroup$
    @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
    $endgroup$
    – Carl Woll
    4 hours ago










  • $begingroup$
    Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
    $endgroup$
    – zack
    1 hour ago


















7












$begingroup$

Since your data can form a star convex polygon, we can sort by the angle with respect to a certain point:



center = Mean[data];
ListLinePlot[ArrayPad[SortBy[data, ArcTan @@ (# - center) &], 0, 1, "Periodic"]]


enter image description here






share|improve this answer











$endgroup$




















    4












    $begingroup$

    By scaling the data into the covariance ellipsoid, we can achieve hands-free auto-scaling before calculating a FindCurvePath along @CarlWoll 's solution:



    path = First@FindCurvePath[
    data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    ListPlot[data[[path]]]


    enter image description here



    Alternatively, if the data points are meant to describe a closed loop, the path can be found with



    path = Last@FindShortestTour[
    data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



    1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 25, 28, 29, 32, 31, 30, 27, 26, 23, 21, 19, 17, 15, 13, 11, 9, 6, 3, 1




    The transformed data that are fed into FindCurvePath or FindShortestTour have a unit covariance matrix, which makes it easier to find a good path:



    Sdata = data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]];
    Chop@Covariance[Sdata]



    1., 0, 0, 1.




    We can see that these scaled points nearly lie on a circle:



    ListPlot[Sdata, AspectRatio -> Automatic]


    enter image description here






    share|improve this answer











    $endgroup$








    • 1




      $begingroup$
      You're missing the plot command for your first image and the command shown for it should be with the second image.
      $endgroup$
      – Bob Hanlon
      1 hour ago






    • 1




      $begingroup$
      Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
      $endgroup$
      – Roman
      1 hour ago










    • $begingroup$
      Thank you for this solution @Roman! It also works excellently.
      $endgroup$
      – zack
      1 hour ago











    Your Answer








    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "387"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f195229%2flistplot-join-points-by-nearest-neighbor-rather-than-order%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    7












    $begingroup$

    You can use FindCurvePath to reorder your data. However, FindCurvePath expects the scale of the two coordinates to be close, so you need to rescale first:



    new = FindCurvePath[data . 1, 0, 0, 100]
    ListLinePlot[data[[#]]& /@ new]



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29,
    28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    enter image description here



    Update



    Roman suggested automating the scaling of the data. Here is one possibility for rescaling the data:



    rescale = RescalingTransform[CoordinateBounds[data]] @ data;


    Then, using FindCurvePath on the rescaled data:



    new = FindCurvePath @ rescale



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25,
    24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    produces the same result.






    share|improve this answer











    $endgroup$








    • 1




      $begingroup$
      Why not just the closely related ListCurvePathPlot?
      $endgroup$
      – Roman
      6 hours ago






    • 1




      $begingroup$
      @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
      $endgroup$
      – Carl Woll
      5 hours ago






    • 1




      $begingroup$
      Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
      $endgroup$
      – Roman
      4 hours ago







    • 1




      $begingroup$
      @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
      $endgroup$
      – Carl Woll
      4 hours ago










    • $begingroup$
      Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
      $endgroup$
      – zack
      1 hour ago















    7












    $begingroup$

    You can use FindCurvePath to reorder your data. However, FindCurvePath expects the scale of the two coordinates to be close, so you need to rescale first:



    new = FindCurvePath[data . 1, 0, 0, 100]
    ListLinePlot[data[[#]]& /@ new]



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29,
    28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    enter image description here



    Update



    Roman suggested automating the scaling of the data. Here is one possibility for rescaling the data:



    rescale = RescalingTransform[CoordinateBounds[data]] @ data;


    Then, using FindCurvePath on the rescaled data:



    new = FindCurvePath @ rescale



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25,
    24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    produces the same result.






    share|improve this answer











    $endgroup$








    • 1




      $begingroup$
      Why not just the closely related ListCurvePathPlot?
      $endgroup$
      – Roman
      6 hours ago






    • 1




      $begingroup$
      @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
      $endgroup$
      – Carl Woll
      5 hours ago






    • 1




      $begingroup$
      Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
      $endgroup$
      – Roman
      4 hours ago







    • 1




      $begingroup$
      @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
      $endgroup$
      – Carl Woll
      4 hours ago










    • $begingroup$
      Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
      $endgroup$
      – zack
      1 hour ago













    7












    7








    7





    $begingroup$

    You can use FindCurvePath to reorder your data. However, FindCurvePath expects the scale of the two coordinates to be close, so you need to rescale first:



    new = FindCurvePath[data . 1, 0, 0, 100]
    ListLinePlot[data[[#]]& /@ new]



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29,
    28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    enter image description here



    Update



    Roman suggested automating the scaling of the data. Here is one possibility for rescaling the data:



    rescale = RescalingTransform[CoordinateBounds[data]] @ data;


    Then, using FindCurvePath on the rescaled data:



    new = FindCurvePath @ rescale



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25,
    24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    produces the same result.






    share|improve this answer











    $endgroup$



    You can use FindCurvePath to reorder your data. However, FindCurvePath expects the scale of the two coordinates to be close, so you need to rescale first:



    new = FindCurvePath[data . 1, 0, 0, 100]
    ListLinePlot[data[[#]]& /@ new]



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29,
    28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    enter image description here



    Update



    Roman suggested automating the scaling of the data. Here is one possibility for rescaling the data:



    rescale = RescalingTransform[CoordinateBounds[data]] @ data;


    Then, using FindCurvePath on the rescaled data:



    new = FindCurvePath @ rescale



    2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25,
    24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




    produces the same result.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 4 hours ago

























    answered 6 hours ago









    Carl WollCarl Woll

    74.2k398193




    74.2k398193







    • 1




      $begingroup$
      Why not just the closely related ListCurvePathPlot?
      $endgroup$
      – Roman
      6 hours ago






    • 1




      $begingroup$
      @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
      $endgroup$
      – Carl Woll
      5 hours ago






    • 1




      $begingroup$
      Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
      $endgroup$
      – Roman
      4 hours ago







    • 1




      $begingroup$
      @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
      $endgroup$
      – Carl Woll
      4 hours ago










    • $begingroup$
      Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
      $endgroup$
      – zack
      1 hour ago












    • 1




      $begingroup$
      Why not just the closely related ListCurvePathPlot?
      $endgroup$
      – Roman
      6 hours ago






    • 1




      $begingroup$
      @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
      $endgroup$
      – Carl Woll
      5 hours ago






    • 1




      $begingroup$
      Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
      $endgroup$
      – Roman
      4 hours ago







    • 1




      $begingroup$
      @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
      $endgroup$
      – Carl Woll
      4 hours ago










    • $begingroup$
      Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
      $endgroup$
      – zack
      1 hour ago







    1




    1




    $begingroup$
    Why not just the closely related ListCurvePathPlot?
    $endgroup$
    – Roman
    6 hours ago




    $begingroup$
    Why not just the closely related ListCurvePathPlot?
    $endgroup$
    – Roman
    6 hours ago




    1




    1




    $begingroup$
    @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
    $endgroup$
    – Carl Woll
    5 hours ago




    $begingroup$
    @Roman Did you try using ListCurvePathPlot? Because the data has such a small variation in the y coordinate, ListCurvePathPlot doesn't work well. That's why I scaled the data and used FindCurvePath to reorder the data, and then plotted the reordered data.
    $endgroup$
    – Carl Woll
    5 hours ago




    1




    1




    $begingroup$
    Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
    $endgroup$
    – Roman
    4 hours ago





    $begingroup$
    Ah yes, brilliant! Maybe even easier for automation would be a hands-free rescaling by the covariance matrix of the data, something like path = First[FindCurvePath[data.(Transpose[#[[2]]]/Sqrt[#[[1]]] &@ Eigensystem[Covariance[data]])]], which tries to map the given data onto a unit circle before applying FindCurvePath. What do you think?
    $endgroup$
    – Roman
    4 hours ago





    1




    1




    $begingroup$
    @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
    $endgroup$
    – Carl Woll
    4 hours ago




    $begingroup$
    @Roman Adding automatic rescaling is a good idea. I added a simple version based on RescalingTransform. You can add an answer using Eigensystem/Covariance if you want.
    $endgroup$
    – Carl Woll
    4 hours ago












    $begingroup$
    Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
    $endgroup$
    – zack
    1 hour ago




    $begingroup$
    Thank you very much for your multiple solutions @CarlWoll! These worked perfectly for all my datasets other than the ones with kinks, those of which I can manually edit.
    $endgroup$
    – zack
    1 hour ago











    7












    $begingroup$

    Since your data can form a star convex polygon, we can sort by the angle with respect to a certain point:



    center = Mean[data];
    ListLinePlot[ArrayPad[SortBy[data, ArcTan @@ (# - center) &], 0, 1, "Periodic"]]


    enter image description here






    share|improve this answer











    $endgroup$

















      7












      $begingroup$

      Since your data can form a star convex polygon, we can sort by the angle with respect to a certain point:



      center = Mean[data];
      ListLinePlot[ArrayPad[SortBy[data, ArcTan @@ (# - center) &], 0, 1, "Periodic"]]


      enter image description here






      share|improve this answer











      $endgroup$















        7












        7








        7





        $begingroup$

        Since your data can form a star convex polygon, we can sort by the angle with respect to a certain point:



        center = Mean[data];
        ListLinePlot[ArrayPad[SortBy[data, ArcTan @@ (# - center) &], 0, 1, "Periodic"]]


        enter image description here






        share|improve this answer











        $endgroup$



        Since your data can form a star convex polygon, we can sort by the angle with respect to a certain point:



        center = Mean[data];
        ListLinePlot[ArrayPad[SortBy[data, ArcTan @@ (# - center) &], 0, 1, "Periodic"]]


        enter image description here







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 1 hour ago









        Bob Hanlon

        61.5k33598




        61.5k33598










        answered 4 hours ago









        Chip HurstChip Hurst

        23.4k15994




        23.4k15994





















            4












            $begingroup$

            By scaling the data into the covariance ellipsoid, we can achieve hands-free auto-scaling before calculating a FindCurvePath along @CarlWoll 's solution:



            path = First@FindCurvePath[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




            ListPlot[data[[path]]]


            enter image description here



            Alternatively, if the data points are meant to describe a closed loop, the path can be found with



            path = Last@FindShortestTour[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 25, 28, 29, 32, 31, 30, 27, 26, 23, 21, 19, 17, 15, 13, 11, 9, 6, 3, 1




            The transformed data that are fed into FindCurvePath or FindShortestTour have a unit covariance matrix, which makes it easier to find a good path:



            Sdata = data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]];
            Chop@Covariance[Sdata]



            1., 0, 0, 1.




            We can see that these scaled points nearly lie on a circle:



            ListPlot[Sdata, AspectRatio -> Automatic]


            enter image description here






            share|improve this answer











            $endgroup$








            • 1




              $begingroup$
              You're missing the plot command for your first image and the command shown for it should be with the second image.
              $endgroup$
              – Bob Hanlon
              1 hour ago






            • 1




              $begingroup$
              Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
              $endgroup$
              – Roman
              1 hour ago










            • $begingroup$
              Thank you for this solution @Roman! It also works excellently.
              $endgroup$
              – zack
              1 hour ago















            4












            $begingroup$

            By scaling the data into the covariance ellipsoid, we can achieve hands-free auto-scaling before calculating a FindCurvePath along @CarlWoll 's solution:



            path = First@FindCurvePath[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




            ListPlot[data[[path]]]


            enter image description here



            Alternatively, if the data points are meant to describe a closed loop, the path can be found with



            path = Last@FindShortestTour[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 25, 28, 29, 32, 31, 30, 27, 26, 23, 21, 19, 17, 15, 13, 11, 9, 6, 3, 1




            The transformed data that are fed into FindCurvePath or FindShortestTour have a unit covariance matrix, which makes it easier to find a good path:



            Sdata = data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]];
            Chop@Covariance[Sdata]



            1., 0, 0, 1.




            We can see that these scaled points nearly lie on a circle:



            ListPlot[Sdata, AspectRatio -> Automatic]


            enter image description here






            share|improve this answer











            $endgroup$








            • 1




              $begingroup$
              You're missing the plot command for your first image and the command shown for it should be with the second image.
              $endgroup$
              – Bob Hanlon
              1 hour ago






            • 1




              $begingroup$
              Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
              $endgroup$
              – Roman
              1 hour ago










            • $begingroup$
              Thank you for this solution @Roman! It also works excellently.
              $endgroup$
              – zack
              1 hour ago













            4












            4








            4





            $begingroup$

            By scaling the data into the covariance ellipsoid, we can achieve hands-free auto-scaling before calculating a FindCurvePath along @CarlWoll 's solution:



            path = First@FindCurvePath[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




            ListPlot[data[[path]]]


            enter image description here



            Alternatively, if the data points are meant to describe a closed loop, the path can be found with



            path = Last@FindShortestTour[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 25, 28, 29, 32, 31, 30, 27, 26, 23, 21, 19, 17, 15, 13, 11, 9, 6, 3, 1




            The transformed data that are fed into FindCurvePath or FindShortestTour have a unit covariance matrix, which makes it easier to find a good path:



            Sdata = data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]];
            Chop@Covariance[Sdata]



            1., 0, 0, 1.




            We can see that these scaled points nearly lie on a circle:



            ListPlot[Sdata, AspectRatio -> Automatic]


            enter image description here






            share|improve this answer











            $endgroup$



            By scaling the data into the covariance ellipsoid, we can achieve hands-free auto-scaling before calculating a FindCurvePath along @CarlWoll 's solution:



            path = First@FindCurvePath[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            2, 1, 3, 6, 9, 11, 13, 15, 17, 19, 21, 23, 26, 27, 30, 31, 32, 29, 28, 25, 24, 22, 20, 18, 16, 14, 12, 10, 8, 7, 5, 4, 2




            ListPlot[data[[path]]]


            enter image description here



            Alternatively, if the data points are meant to describe a closed loop, the path can be found with



            path = Last@FindShortestTour[
            data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]]]



            1, 2, 4, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24, 25, 28, 29, 32, 31, 30, 27, 26, 23, 21, 19, 17, 15, 13, 11, 9, 6, 3, 1




            The transformed data that are fed into FindCurvePath or FindShortestTour have a unit covariance matrix, which makes it easier to find a good path:



            Sdata = data.Transpose[#[[2]]/Sqrt[#[[1]]]&@Eigensystem[Covariance[data]]];
            Chop@Covariance[Sdata]



            1., 0, 0, 1.




            We can see that these scaled points nearly lie on a circle:



            ListPlot[Sdata, AspectRatio -> Automatic]


            enter image description here







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 1 hour ago

























            answered 3 hours ago









            RomanRoman

            5,39311131




            5,39311131







            • 1




              $begingroup$
              You're missing the plot command for your first image and the command shown for it should be with the second image.
              $endgroup$
              – Bob Hanlon
              1 hour ago






            • 1




              $begingroup$
              Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
              $endgroup$
              – Roman
              1 hour ago










            • $begingroup$
              Thank you for this solution @Roman! It also works excellently.
              $endgroup$
              – zack
              1 hour ago












            • 1




              $begingroup$
              You're missing the plot command for your first image and the command shown for it should be with the second image.
              $endgroup$
              – Bob Hanlon
              1 hour ago






            • 1




              $begingroup$
              Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
              $endgroup$
              – Roman
              1 hour ago










            • $begingroup$
              Thank you for this solution @Roman! It also works excellently.
              $endgroup$
              – zack
              1 hour ago







            1




            1




            $begingroup$
            You're missing the plot command for your first image and the command shown for it should be with the second image.
            $endgroup$
            – Bob Hanlon
            1 hour ago




            $begingroup$
            You're missing the plot command for your first image and the command shown for it should be with the second image.
            $endgroup$
            – Bob Hanlon
            1 hour ago




            1




            1




            $begingroup$
            Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
            $endgroup$
            – Roman
            1 hour ago




            $begingroup$
            Thanks @BobHanlon , for some reason the formatting got scrambled when I added the second image.
            $endgroup$
            – Roman
            1 hour ago












            $begingroup$
            Thank you for this solution @Roman! It also works excellently.
            $endgroup$
            – zack
            1 hour ago




            $begingroup$
            Thank you for this solution @Roman! It also works excellently.
            $endgroup$
            – zack
            1 hour ago

















            draft saved

            draft discarded
















































            Thanks for contributing an answer to Mathematica Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            Use MathJax to format equations. MathJax reference.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f195229%2flistplot-join-points-by-nearest-neighbor-rather-than-order%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How to create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

            Category:Tremithousa Media in category "Tremithousa"Navigation menuUpload media34° 49′ 02.7″ N, 32° 26′ 37.32″ EOpenStreetMapGoogle EarthProximityramaReasonatorScholiaStatisticsWikiShootMe

            Dokschytsy (Steed) Kwelen | NawigatsjuunBelarus: Vitebsk Region, citypopulation.de