我有以下代码,其中包含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
来单独绘制它们,但是我如何在图表上绘制它们,对于所有我?
谢谢。
答案 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)
如果您将值存储在数据文件中,则可以使用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]
从文件的第二行到第五行运行。