gpt4 book ai didi

Gnuplot 在 loglog 图中平滑数据

转载 作者:行者123 更新时间:2023-12-04 07:56:11 31 4
gpt4 key购买 nike

我想绘制基于数据集的平滑曲线,该数据集跨越 x 中的 13 个数量级 [1E-9:1E4] 和 y 中的 4 个数量级 [1E-6:1e-2]。
MWE:

set log x
set log y
set xrange [1E-9:1E4]
set yrange [1E-6:1e-2]
set samples 1000

plot 'data.txt' u 1:3:(1) smooth csplines not
x=10 以上的平滑曲线看起来不错。下面,它只是一条直线,直到 x=1e-9 处的点。
当将样本增加到 1e4 时,平滑在 x=1 之上效果很好。对于样本 1e5,平滑在 x=0.1 以上效果很好,依此类推。
关于如何在不将样本设置为 1e10 的情况下将平滑应用于较低数据点的任何想法(无论如何都不起作用......)?
谢谢和最好的问候!
J.P

最佳答案

据我了解,gnuplot 中的采样是线性的。我不知道,但也许 gnuplot 中有一个我还没有找到的对数采样。
以下是对尚不完美但可以作为起点的解决方法的建议。
例如,我们的想法是将您的数据分成几十年,并分别对它们进行平滑处理。
缺点是范围之间可能存在一些重叠。当您使用 set samples 时,您可以以某种方式最小化或隐藏这些和 every ::n或者也许有另一种方法来消除重叠。
代码:

### smoothing over several orders of magnitude
reset session

# create some random test data
set print $Data
do for [p=-9:3] {
do for [m=1:9:3] {
print sprintf("%g %g", m*10**p, (1+rand(0))*10**(p/12.*3.-2))
}
}
set print

set logscale x
set logscale y
set format x "%g"
set format y "%g"

set samples 100
pMin = -9
pMax = 3
set table $Smoothed
myFilter(col,p) = (column(col)/10**p-1) < 10 ? column(col) : NaN
plot for [i=pMin:pMax] $Data u (myFilter(1,i)):2 smooth cspline
unset table

plot $Data u 1:2 w p pt 7 ti "Data", \
$Smoothed u 1:2 every ::3 w l ti "cspline"
### end of code
结果:
enter image description here
添加:
感谢@maij,他指出可以通过简单地将整个范围映射到线性空间来简化它。与@maij 的解决方案相反,我会让 gnuplot 处理对数轴,并通过一些表格图的额外努力使实际的绘图命令尽可能简单。
代码:
### smoothing in loglog plot
reset session

# create some random test data
set print $Data
do for [p=-9:3] {
do for [m=1:9:3] {
print sprintf("%g %g", m*10**p, (1+rand(0))*10**(p/12.*3.-2))
}
}
set print

set samples 500
set table $SmoothedLog
plot $Data u (log10($1)):(log10($2)) smooth csplines
set table $Smoothed
plot $SmoothedLog u (10**$1):(10**$2) w table
unset table

set logscale x
set logscale y
set format x "%g"
set format y "%g"
set key top left

plot $Data u 1:2 w p pt 7 ti "Data", \
$Smoothed u 1:2 w l lc "red" ti "csplines"
### end of code
结果:
enter image description here

关于Gnuplot 在 loglog 图中平滑数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66689360/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com