在使用gnuplot的对数刻度时减少数据点

3
我有一组大量的数据点,从x = 1到x = 10e13(步长约为3e8)。当我尝试使用对数刻度绘制它们时,末尾的密度显然非常高。当然,这会影响我的输出图,因为PostScript和SVG文件(保存每个数据点)变得非常大。
有没有办法告诉gnuplot动态地减少数据密度?
示例数据here。在对数x轴上显示一条直线。

我想我可能有一个想法。你能提供一些样本数据吗? - Tom Fenech
在问题中添加了一个链接。 - MrD
2个回答

2
今日免费次数已满, 请开通会员/明日再来
plot 'sample.dat' using (filter($1) ? $1 : 1/0):2

现在你需要定义一个适当的筛选函数来改变数据密度。以下是一份提议,使用伪数据,但你可以肯定地找到更好的一个,它不显示这个典型的对数模式:
set logscale x
reduce(x) = x/(10**(floor(log10(x))))
filterfunc(x) = abs(log10(sc)+(log10(x) - floor(log10(x))) - log10(floor(sc*reduce(x))))
filter(x) = filterfunc(x) < 1e-5 ? x : 1/0

set multiplot layout 1,2
sc = 1
plot 'sample.data' using (filter($1)):2 notitle
sc = 10
replot

变量sc允许更改密度。结果是(使用4.6.5):

enter image description here


我仍在寻找一种不显示对数模式的解决方案。我曾经有一个类似的解决方案(但它使用了数据预处理),也遭受了同样的问题。 - MrD
1
可以通过赋予术语(log10(x) - floor(log10(x)))更大的权重来抑制该模式。 - MrD

1

我受到Christoph的回答的启发,做了一些工作,能够在对数刻度中获得相等的间距。我进行了过滤,如果序列中有数字,您可以简单地使用最大整数函数,然后通过比较小数部分找到最接近它的对数刻度。精度在这里由precision_parameter调整。

precision_parameter=100
function(x)=(-floor(precision_parameter*log10(x))+(precision_parameter*log10(x)))

现在使用下面定义的筛选函数进行筛选。
density_parameter = 3.5
filter(x)=(function(x) < 1/(log10(x))**density_parameter &  function(x-1) > 1/(log10(x))**density_parameter ) ? x : 1/0
set datafile missing "NaN"

最后一行有助于在折线图中绘制线点。我使用了xx-1,假设xdata是等差数列,公差为1,根据您的数据进行相应更改。只需将x替换为filter(x)即可在绘图命令中使用。

plot 'sample_data.dat' u (filter($1)):2 w lp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接