Gnuplot 将每个点连接在一起

Cam*_*Cam 5 gnuplot

我在 gnuplot 中绘制数据,如下所示:

set terminal pdf
set output "Planck.pdf"
plot "CalculatedValues.dat" u 1:2 t "Dawn" pt 1 ps .1 with lines
Run Code Online (Sandbox Code Playgroud)

但我的输出最终看起来像一个纱线雕塑,

在此处输入图片说明

我希望输出看起来像一个折线图而不是散点图。

在此处输入图片说明

我究竟做错了什么?

这是一些数据:

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
Run Code Online (Sandbox Code Playgroud)

它是制表符分隔和新行分隔

Mat*_*hew 5

问题在于您的积分顺序。Gnuplot 将用线连接文件中的连续点。如果点根据 x 轴值(在本例中为第一列)按顺序排列,您将得到您想要的结果。如果不是,你会得到你所看到的奇怪的结果。

未排序的数据

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
Run Code Online (Sandbox Code Playgroud)

plot datafile u 1:2 w linespoints pt 7产生以下

在此处输入图片说明

这里对点进行编号以显示它们的绘制顺序。我们可以看到数据文件中连续出现的点是连接的。

排序数据

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
Run Code Online (Sandbox Code Playgroud)

plot datafile u 1:2 w linespoints pt 7产生以下

在此处输入图片说明

在这里,我们看到绘制了相同的点,但顺序不同。同样,连续的点是连接的,但按递增顺序完成,因为数据是这样排序的。


解决方案是先对数据进行排序。要么让生成数据的程序在生产过程中对其进行排序,要么在绘图之前使用外部程序对其进行排序。

如果第一列中的值是唯一的,则可以对原始未排序数据使用一个平滑选项。例如,

plot datafile u 1:2 smooth unique w linespoints pt 7
Run Code Online (Sandbox Code Playgroud)

将产生与使用排序数据绘图相同的结果。 这是因为平滑唯一选项首先按 x 列对数据进行排序。y 值被替换为具有相应 x 值的所有 y 值的平均值。如果 x 值是唯一的,这意味着保留原始数据,只是按排序顺序。


**†**显示的绘图命令只会绘制线条。为了获得数字标签,我们使用
plot datafile u 1:2 w linespoints pt 7, \
           "" u 1:2:(sprintf("%d",$0+1)) w labels offset 0,graph 0.05
Run Code Online (Sandbox Code Playgroud)

它在每个点坐标处绘制一个标签,向上移动图形范围的 5%(使用图形坐标系)。由于 0 伪列(行号)是从 0 开始的,我们添加 1 以生成标签,我们将给出从 1 开始的标签。

如果我们想在这里标记点,我们必须使用 set table 来捕获平滑的数据,然后绘制数据。正在做

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
Run Code Online (Sandbox Code Playgroud)

将完全生成上面的排序图。数据被捕获到一个临时文件中,第一个绘图命令只生成点。以下 plot 命令将现在排序的数据与标签一起绘制。这允许 gnuplot 自己进行所有排序,但同样,这仅在第一列中的值唯一时才有效。