我可以在for循环中计算一些东西,然后在同一个图上绘制这些值吗?

时间:2014-11-08 15:12:48

标签: for-loop gnuplot

我有以下代码,其中包含4行:

plot for [i=1:4] \
path_to_file using 1:(column(i)) , \

我还想在此图上绘制8条水平线,其值来自mydata.txt。

我从Gnuplot: How to load and display single numeric value from data file的答案中看到,我可以使用stats命令来访问我感兴趣的常量值。我想我可以按如下方式访问单元格(row,col): / p>

stats 'mydata.txt' every ::row::row using col nooutput
value = int(STATS_min)

但他们的位置是我的功能。所以,在plot命令中,我想添加类似的东西:

for [i=1:4] \
stats 'mydata.txt' every ::(1+i*10)::(1+i*10) using 1 nooutput
mean = int(STATS_min)
stats 'mydata.txt' every ::(1+i*10)::(1+i*10) using 2 nooutput
SE = int(STATS_min)
upper = mean + 2 * SE
lower = mean - 2 * SE

然后将图形上方和下方的水平线作为上图。

我想我可以通过输入plot upper, lower来单独绘制它们,但是我如何在图表上绘制它们,对于所有我?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以创建一个数组并将值存储在其中,然后使用索引引用数组中可以在循环内访问它的位置。

您可以按如下方式创建数组:

array=""
do for [i=1:4] {
val = i / 9.
array = sprintf("%s %g",array,val)
}

我存储了4个值:1 / 9,2 / 9,3 / 9和4/9。在您的情况下,您将运行stats并存储您的upper和/或lower变量。您可以通过这种方式检查数组的外观:

gnuplot> print array
 0.111111 0.222222 0.333333 0.444444

对于绘图,您可以使用word(array,i)访问数组中的不同元素,其中i指的是位置。由于数组是一个字符串,您需要将其转换为float,这可以乘以1.

plot for [i=1:4] 1.*word(array,i)

enter image description here

如果您将值存储在数据文件中,则可以使用awk或使用gnuplot处理它:

array = ""
plot for [i=1:4] "data" every ::i::i u (array=sprintf("%s %g",array,$1), 1/0), \
for [i=1:4] 1.*word(array,i)

第一个plot实例从第一列数据条目创建数组而不绘制点(1/0选项告诉gnuplot忽略它们,因此需要警告消息)和第二个plot实例实例使用array中存储的值作为变量(因此在这种情况下为水平线)。请注意,every将0作为第一个条目,因此[i=1:4]从文件的第二行到第五行运行。