在 Gnuplot 中以 loglog 比例绘制时减少数据点的数量

问题描述

我有一个很大的数据集,我需要在 Gnuplot 中以 loglog 比例绘制,如下所示:

set log xy
plot 'A_1D_l0.25_L1024_r0.dat' u 1:($2-512)

LogLogPlot of my datapoints

Text file with the datapoints

x 轴上的数据点等距分布,但由于对数刻度,它们在图形的右侧变得非常密集,因此输出文件(我最终将其导出为 .tex)变得非常大。 在线性比例中,我会简单地使用选项 every 来减少绘制的点数。 loglogscale 是否有类似的选项,以便绘制的点显示为等距?

我知道几年前提出过类似的 question,但在我看来,解决方案并不令人满意:绘制的点沿 x 轴的间距不等。我认为这是一个非常简单的问题,值得一个更清晰的解决方案。

解决方法

据我所知,您不想绘制实际数据点;你只想在它们之间画一条线。但是您希望保留点的外观而不是一条线。是吗?

  set log xy
  plot 'A_1D_l0.25_L1024_r0.dat' u 1:($2-512) with lines dashtype '.' lw 2

enter image description here

修正答案

如果在数据集中呈现异常值/错误很重要,那么您不得使用 every 或任何其他简单地丢弃或跳过大部分数据点的技术。在这种情况下,我更喜欢您在原始问题中显示的图 with points,可能会进行修改以将每个点表示为一个点而不是一个十字。我将通过修改您的 500000 点数据集中的一个点来模拟这一点(下图第一张图)。但我也建议,如果绘制 with lines(下图第二个图),异常值的存在会更加明显。

显示错误边界是噪声数据的另一种选择,但选项取决于您必须在数据集中处理什么。如果你想继续,请提出一个单独的问题。

enter image description here enter image description here

,

如果你真的想减少要绘制的数据数量,你可以考虑下面的脚本。

s = 0.1           ### sampling interval in log scale
                  ###  (try 0.05 for more detail)

c = log10(0.01)   ### a parameter used in sampler(x) 
                  ### which should be initialized by 
                  ### smaller value than any x in log scale

sampler(x) = (x>0 && log10(x)>=c) ? (c=ceil(log10(x)/s+0.5)*s,x) : NaN

set log xy
set grid xtics
plot 'A_1D_l0.25_L1024_r0.dat' using (sampler($1)):($2-512) with points pt 7 lt 1 notitle,\
     'A_1D_l0.25_L1024_r0.dat' using 1:($2-512) with lines lt 1 notitle

此脚本以对数刻度在 x 轴上以大约 0.1 的增量对数据进行采样。它利用了不绘制在 using 中 x 值被评估为 NaN 的点的特性。

enter image description here