Search code examples
gnuplot

Gnuplot is connecting every single point together


I am plotting data in gnuplot like so:

set terminal pdf
set output "Planck.pdf"
plot "CalculatedValues.dat" u 1:2 t "Dawn" pt 1 ps .1 with lines

But my output ends up looking like a yarn sculpture,

enter image description here

I want the output to look like, but a line graph instead of a scatter plot.

enter image description here

What am I doing wrong?

Here is some data:

13.4904 3.13714e+07     3.91106e+07
11.3872 4.64475e+07     5.96647e+07
18.0928 1.40999e+07     1.69117e+07
13.3284 3.23223e+07     4.03737e+07
1.3264  3309.46 24012.2
0.323113        5.16869e-25     1.764e-21
10.6252 5.35423e+07     6.97629e+07

It's tab separated and new line separated


Solution

  • The problem is with the order of your points. Gnuplot will connect consecutive points in the file with lines. If the points are in order based on the x-axis value (the first column in this case), you will get what you are after. If they are not, you will get strange results like you are seeing.

    Unsorted Data

    13.4904   3.13714e+07   3.91106e+07
    11.3872   4.64475e+07   5.96647e+07
    18.0928   1.40999e+07   1.69117e+07
    13.3284   3.23223e+07   4.03737e+07
    1.3264    3309.46       24012.2
    0.323113  5.16869e-25   1.764e-21
    10.6252   5.35423e+07   6.97629e+07
    

    plot datafile u 1:2 w linespoints pt 7 produces the following

    enter image description here

    Here the points are numbered to show the order they are plotted in. We can see that points that occur consecutively in the datafile are connected.

    Sorted Data

    0.323113   5.16869e-25   1.764e-21
    1.3264     3309.46       24012.2
    10.6252    5.35423e+07   6.97629e+07
    11.3872    4.64475e+07   5.96647e+07
    13.3284    3.23223e+07   4.03737e+07
    13.4904    3.13714e+07   3.91106e+07
    18.0928    1.40999e+07   1.69117e+07
    

    plot datafile u 1:2 w linespoints pt 7 produces the following

    enter image description here

    Here we see that the same points are plotted, but in a different order. Again, consecutive points are connected, but are done in an increasing order, as the data is sorted in such a matter.


    The solution is to sort your data first. Either have the program generating the data sort it during production, or use an external program to sort it before plotting.

    If the values in the first column are unique, one of the smoothing options can be used with the original unsorted data. For example,

    plot datafile u 1:2 smooth unique w linespoints pt 7
    

    will produce the same results as plotting with the sorted data. This is because the smooth unique option first sorts the data by the x column. The y values are replaced with the average of all y values with the corresponding x value. If the x values are unique, this means that the original data is preserved, just in sorted order.


    The plot command shown will only draw the lines. To get the numerical labels as well, we use

    plot datafile u 1:2 w linespoints pt 7, \
               "" u 1:2:(sprintf("%d",$0+1)) w labels offset 0,graph 0.05
    

    which plots a label at each point coordinate moved upward by 5% of the graph range (using the graph coordinate system). As the 0 pseudocolumn (the line number) is 0-based, we add one in order to generate the label, which we will give 1-based labels.

    If we wanted to label the points here, we would have to use set table to capture the smoothed data, and then plot data. Doing

    set table "tempfile"
    plot datafile u 1:2 smooth unique
    unset table
    plot "tempfile" u 1:2 w linespoints pt 7, \
                 "" u 1:2:(sprintf("%d",$0+1)) w labels offset 0,graph 0.05
    

    will produce exactly the sorted graph above. The data is captured to a temporary file and the first plot command just generates the points. The following plot command plots the now sorted data along with the labels. This allows gnuplot to do all of the sorting itself, but again, this will only work if the values in the first column are unique.