我有一组大量的数据点,从x = 1到x = 10e13(步长约为3e8)。当我尝试使用对数刻度绘制它们时,末尾的密度显然非常高。当然,这会影响我的输出图,因为PostScript和SVG文件(保存每个数据点)变得非常大。
有没有办法告诉gnuplot动态地减少数据密度?
示例数据here。在对数x轴上显示一条直线。
有没有办法告诉gnuplot动态地减少数据密度?
示例数据here。在对数x轴上显示一条直线。
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):
(log10(x) - floor(log10(x)))
更大的权重来抑制该模式。 - MrD我受到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"
最后一行有助于在折线图中绘制线点。我使用了x
和x-1
,假设xdata是等差数列,公差为1,根据您的数据进行相应更改。只需将x替换为filter(x)即可在绘图命令中使用。
plot 'sample_data.dat' u (filter($1)):2 w lp