你如何在 gnuplot 中对每第 n 列数据求和?
How do you sum every nth column of data in gnuplot?
我想对 Gnuplot 中的数据集的几列取平均值。问题是我想平均每隔一列(从我的数据集的第二列开始)。我正在考虑以某种方式使用 every,但我仍然不太了解何时何地使用 every。为了帮助形象化我的问题:我的数据看起来像这样:
x y1 z1 y2 z2
2 0.6 0 0.6 0
1 0.7 0 0.7 1
1 0.8 2 0.8 1
1 0.9 0 0.9 0
我想对 y1 和 y2 取平均值并通过执行以下操作绘制结果:
stats filename nooutput
plot filename u 1:sum[col = every :2::2::STATS_columns] / ((STATS_columns-1)/2)
不确定这是否接近可行。此外,如果有一种方法可以在不先验了解数据是什么样子的情况下找到使用的列数,那就太好了。在示例中,我利用我对数据的了解知道平均值超过 ((STATS_columns-1)/2) 个点数。
感谢您的回复
根据您的代码,我假设您想要对每一行的 y1 和 y2 进行平均,然后将其与 x(第 1 列)作图。由于您有几个相同的 x 值,因此会有另一个平均值,即列和所有相同 x 值的平均值。
我修改了您的数据以更好地说明差异。
我猜你问的是红色圆圈。蓝色三角形基本上是平均值的平均值,即红色点的平均值。
检查 help summation
和 help smooth
。 sum
与索引没有步长。
来自 gnuplot 帮助:
sum [<var> = <start> : <end>] <expression>
代码:
### average over columns and smooth
reset session
$Data <<EOD
#x y1 z1 y2 z2
1 2.0 0 4.0 0
1 2.2 0 4.2 1
1 2.9 2 4.9 1
2 2.1 0 4.1 0
2 2.3 0 4.3 0
2 2.8 0 4.8 0
3 2.2 0 4.2 0
3 2.3 0 4.3 0
3 2.7 0 4.7 0
EOD
stats $Data nooutput
set offsets 0.5,0.5,0.5,0.5
Count = (STATS_columns-1)/2
plot $Data u 1:((sum[i=1:Count] column(i*2))/Count) w p pt 7 lc rgb "red" ti "average over y1,y2 columns for each row",\
$Data u 1:((sum[i=1:Count] column(i*2))/Count) smooth unique w p pt 9 lc rgb "blue" ti "average over y1,y2 for each x"
### end of code
结果:
我想对 Gnuplot 中的数据集的几列取平均值。问题是我想平均每隔一列(从我的数据集的第二列开始)。我正在考虑以某种方式使用 every,但我仍然不太了解何时何地使用 every。为了帮助形象化我的问题:我的数据看起来像这样:
x y1 z1 y2 z2
2 0.6 0 0.6 0
1 0.7 0 0.7 1
1 0.8 2 0.8 1
1 0.9 0 0.9 0
我想对 y1 和 y2 取平均值并通过执行以下操作绘制结果:
stats filename nooutput
plot filename u 1:sum[col = every :2::2::STATS_columns] / ((STATS_columns-1)/2)
不确定这是否接近可行。此外,如果有一种方法可以在不先验了解数据是什么样子的情况下找到使用的列数,那就太好了。在示例中,我利用我对数据的了解知道平均值超过 ((STATS_columns-1)/2) 个点数。
感谢您的回复
根据您的代码,我假设您想要对每一行的 y1 和 y2 进行平均,然后将其与 x(第 1 列)作图。由于您有几个相同的 x 值,因此会有另一个平均值,即列和所有相同 x 值的平均值。
我修改了您的数据以更好地说明差异。
我猜你问的是红色圆圈。蓝色三角形基本上是平均值的平均值,即红色点的平均值。
检查 help summation
和 help smooth
。 sum
与索引没有步长。
来自 gnuplot 帮助:
sum [<var> = <start> : <end>] <expression>
代码:
### average over columns and smooth
reset session
$Data <<EOD
#x y1 z1 y2 z2
1 2.0 0 4.0 0
1 2.2 0 4.2 1
1 2.9 2 4.9 1
2 2.1 0 4.1 0
2 2.3 0 4.3 0
2 2.8 0 4.8 0
3 2.2 0 4.2 0
3 2.3 0 4.3 0
3 2.7 0 4.7 0
EOD
stats $Data nooutput
set offsets 0.5,0.5,0.5,0.5
Count = (STATS_columns-1)/2
plot $Data u 1:((sum[i=1:Count] column(i*2))/Count) w p pt 7 lc rgb "red" ti "average over y1,y2 columns for each row",\
$Data u 1:((sum[i=1:Count] column(i*2))/Count) smooth unique w p pt 9 lc rgb "blue" ti "average over y1,y2 for each x"
### end of code
结果: