在gnuplot中使用logscale时减少数据点

在gnuplot中使用logscale时减少数据点,gnuplot,Gnuplot,我有一组从x=1到x=10e13的大量数据点(步长固定在3e8左右)。 当我试着用对数标度绘制它们时,我肯定会在最后得到一个难以置信的巨大点密度。当然,这会影响我的输出图,因为postscript和svg文件(包含每个数据点)变得越来越大 有没有办法告诉gnuplot动态降低数据密度 样本数据。使用对数x轴显示直线。通常,对于此类绘图,可以使用筛选函数选择所需点并丢弃所有其他点(将其值设置为1/0: 比如: plot 'sample.dat' using (filter($1) ? $1 : 1

我有一组从x=1到x=10e13的大量数据点(步长固定在3e8左右)。 当我试着用对数标度绘制它们时,我肯定会在最后得到一个难以置信的巨大点密度。当然,这会影响我的输出图,因为postscript和svg文件(包含每个数据点)变得越来越大

有没有办法告诉
gnuplot
动态降低数据密度


样本数据。使用对数x轴显示直线。

通常,对于此类绘图,可以使用筛选函数选择所需点并丢弃所有其他点(将其值设置为
1/0

比如:

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
设置对数刻度x
减少(x)=x/(10**(楼层(log10(x)))
过滤函数=abs(log10(sc)+(log10(x)-地板(log10(x)))-log10(地板(sc*reduce(x)))
滤波器(x)=滤波器滤波器滤波器(x)<1e-5?x:1/0
设置多点布局1,2
sc=1
使用(过滤器($1)):2 notitle绘制“sample.data”
sc=10
雷普特
变量
sc
允许更改密度。结果为(4.6.5)为:


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

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"

我想我可能有一个想法。你能提供一些样本数据吗?在问题中添加了一个链接我仍在寻找一个不显示对数模式的解决方案。我有一个类似的解决方案(尽管它使用了数据预处理),该解决方案存在相同的模式。可以通过给出术语
(log10(x))来支持该模式-地板(log10(x))
更重。
plot 'sample_data.dat' u (filter($1)):2 w lp