【问题标题】:Can I calculate something inside a for loop and then plot those values on the same graph?我可以在 for 循环中计算一些东西,然后在同一张图上绘制这些值吗?
【发布时间】:2014-11-08 15:12:47
【问题描述】:

我有以下代码,它绘制了 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命令访问我感兴趣的常量值。我想我可以访问单元格(行,列)如下:

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

但它们的位置是 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 来分别绘制它们,但我如何在上面的图表上为所有 i 绘制它们?

谢谢。

【问题讨论】:

    标签: for-loop gnuplot


    【解决方案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] 从文件的第二行到第五行运行。

    【讨论】:

    • Miguel,您建议创建一个数组,通过循环 i 并使用 stats 命令在该数组中创建条目,然后绘制该数组的元素。该文件 mydata.txt 来自 Excel 文件,因此我意识到在 Excel 中创建“上”和“下”可能更容易。假设我在我的文件 mydata.txt 中的第 1 列和第 2 列中有我想要绘制的所有值。不是循环通过它来创建我的数组,是否可以直接从这个文件创建一个二维数组然后绘制值,使用例如图为 [i=1:4] [j=1:2] 1.*word(array,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 个点,而不是水平线。这可能是因为我同时使用“每个”和“使用”,但我看不到如何在我的图表上绘制水平线。我想我将不得不开始一个新帖子,因为我想应该比这更容易,而且我可能还没有很好地解释自己!
    • 在答案末尾查看我的编辑,这应该适合你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2014-04-19
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多