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

时间:2014-04-03 13:49:02

标签: gnuplot

我有一大组数据点,从x = 1到x = 10e13(步长固定为大约3e8)。 当我尝试使用logscale绘制它们时,我肯定会在最后得到一个令人难以置信的巨大点密度。当然这会影响我的输出图,因为postscript和svg文件(保存每个数据点)变得非常大。

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

示例数据here。使用对数x轴显示直线。

2 个答案:

答案 0 :(得分:2)

通常,对于这种情节,可以使用过滤函数选择所需的点并丢弃所有其他点(将其值设置为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

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

enter image description here

答案 1 :(得分:1)

我做了一些工作,灵感来自克里斯托夫(Christoph)的答案,并且能够获得相等的对数刻度间距。我进行了过滤,如果序列中有数字,则可以简单地使用Greatest整数函数,然后通过比较小数部分来找到对数刻度中最接近的整数函数。精度在这里由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为共同差,请根据您的数据进行相应的更改。只需在plot命令中用filter(x)替换x。

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