首页 > 解决方案 > 使用来自多个文件的列数据进行 Gnuplot 绘图

问题描述

我有两个文件“f.txt”和“g.txt”。两个文件中的数据都排列在两列中,列分隔符只是几个空格。第一列代表自变量“x”,第二列代表 f(x)(或 g(x))。绘制函数 y= f(x) 和 y = g(x) 很容易,但是有没有一种简单的方法可以根据 g(x) 绘制 f(x)?当然,使用 bash,我可以创建一个包含第一列 g(x) 和第二列 f(x) 的“中间”文件,然后正常绘制这个文件。但是有没有办法在不实际创建这个文件的情况下做到这一点?

标签: filegnuplot

解决方案


你的问题部分矛盾。看起来你有两个文件,每个文件有两列,即x,f(x)x,g(x). 我假设行数和 x 的值是相同的。而你“只是”想要f(x)g(x). 但这绘图不同f(g(x))(如您最初的问题)。在后一种情况下,您可能需要插值。

@Christoph 已经指出了一个使用 awk 合并到文件的简单解决方案。如果您没有或不想使用 awk,这里有一个有点麻烦的 gnuplot-only解决方案。

  1. 将文件 1:1 加载到数据块(请参阅gnuplot: 将数据文件 1:1 加载到数据块中,尽管仍然没有完全回答)
  2. 删除行尾字符。这取决于操作系统。对于 Windows,我必须将\r其作为行尾字符(由于某种原因不是\r\n)。目前,我无法测试 Linux 和 MacOS。
  3. 打印/追加行到一个新的数据块

数据:

f.txt

A,B
1,3
2,6
3,5

g.txt

A,C
1,8
2,4
3,7

代码:

### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session

# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo   $Data1 ^<^<EOD  & type "'.FILE1.'"' }
else                                { load '< echo "\$Data1  << EOD" &  cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo   $Data2 ^<^<EOD  & type "'.FILE2.'"' }
else                                { load '< echo "\$Data2  << EOD" &  cat "'.FILE2.'"' } # Linux & MacOS

mySeparator = ","
myEOLc = sprintf("\r",0)     # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ?  s[1:strlen(s)-strlen(myEOLc)] : s

set print $Data3
    do for [i=1:|$Data1|] {
        print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
    }
set print

print $Data3
### end of code

结果:

A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7

然后根据需要绘制数据...

添加:

如果您的文件有空格作为列分隔符,您可以使用word("string",n)从中提取“列” $Data[i](请参阅​​ 参考资料help word)。然后你需要改变这些行:

mySeparator = " "

print sprintf("%s%s%s", word(RemoveEOLc($Data1[i]),2), mySeparator, word(RemoveEOLc($Data2[i]),2))

结果:

B C
3 8
6 4
5 7

推荐阅读