问题描述
我有一个很大的数据集,我需要在 Gnuplot 中以 loglog 比例绘制,如下所示:
set log xy
plot 'A_1D_l0.25_L1024_r0.dat' u 1:($2-512)
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
修正答案
如果在数据集中呈现异常值/错误很重要,那么您不得使用 every
或任何其他简单地丢弃或跳过大部分数据点的技术。在这种情况下,我更喜欢您在原始问题中显示的图 with points
,可能会进行修改以将每个点表示为一个点而不是一个十字。我将通过修改您的 500000 点数据集中的一个点来模拟这一点(下图第一张图)。但我也建议,如果绘制 with lines
(下图第二个图),异常值的存在会更加明显。
显示错误边界是噪声数据的另一种选择,但选项取决于您必须在数据集中处理什么。如果你想继续,请提出一个单独的问题。
,如果你真的想减少要绘制的数据数量,你可以考虑下面的脚本。
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 的点的特性。