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

For loop 我可以在for循环中计算一些东西,然后在同一个图上绘制这些值吗?,for-loop,gnuplot,For Loop,Gnuplot,我有以下代码,它绘制了4行: plot for [i=1:4] \ path_to_file using 1:(column(i)) , \ 我还想在此图上绘制8条水平线,其值来自mydata.txt 从对的回答中,我看到我可以使用stats命令访问我感兴趣的常量值。我想我可以按如下方式访问单元格(行、列): stats 'mydata.txt' every ::row::row using col nooutput value = int(STATS_min) array="" do fo

我有以下代码,它绘制了4行:

plot for [i=1:4] \
path_to_file using 1:(column(i)) , \
我还想在此图上绘制8条水平线,其值来自mydata.txt

从对的回答中,我看到我可以使用stats命令访问我感兴趣的常量值。我想我可以按如下方式访问单元格(行、列):

stats 'mydata.txt' every ::row::row using col nooutput
value = int(STATS_min)
array=""
do for [i=1:4] {
val = i / 9.
array = sprintf("%s %g",array,val)
}
但它们的位置是i的函数。因此,在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
来分别绘制它们,但是如何在上面的图表上绘制它们呢


谢谢。

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

您可以按如下方式创建阵列:

stats 'mydata.txt' every ::row::row using col nooutput
value = int(STATS_min)
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)

如果数据文件中存储有值,则可以使用
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
中的值作为变量(因此在本例中为水平线). 请注意,
每个
都将0作为第一个条目,因此
[i=1:4]
从文件的第二行到第五行运行。

Miguel,您建议创建一个数组,通过循环i并使用stats命令在该数组中创建条目,然后绘制该数组的元素。文件mydata.txt来自Excel文件,因此我意识到在Excel中创建“上”和“下”可能更容易。假设我在文件mydata.txt的第1列和第2列中有所有要绘制的值。与其循环使用此文件来创建我的数组,是否可以直接从此文件创建二维数组,然后使用[i=1:4][j=1:2]1.*word(数组,i,j)绘图来绘制值?这实际上不是一个数组,而是一个字符串,可以使用
word()
从中提取由空格分隔的单个元素,因此,您不需要使用二维数组,而是需要使用两个数组(j=1,2)或将两个索引映射到一个:k=i*(N-1)+j,其中N=条目数。要从文件中读入值并将其作为变量存储在gnuplot中,您需要使用一个外部实用程序,例如awk(在这个站点上有很多相关内容)。但是,如果您已经有了要在文件上打印的值,那么没有什么可以阻止您使用
every
关键字直接打印它们!祝你好运所以,我想沿着“每一个”的路线走,因为这些值已经在一个文件中了。我在本文顶部的原始脚本中添加了“for[I=1:4]path_to_expt every::I::I using 1”,但它只绘制了4个点,而不是水平线。这可能是因为我同时使用了“every”和“using”,但我看不出如何在图形上绘制水平线。我想我将不得不开始一个新的帖子,因为我认为应该比这更容易,而且我可能还没有很好地解释我自己!请参阅答案末尾的我的编辑,这应该对您有用。