file - 使用来自多个文件的列数据进行 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) 的“中间”文件,然后正常绘制这个文件。但是有没有办法在不实际创建这个文件的情况下做到这一点?
解决方案
你的问题部分矛盾。看起来你有两个文件,每个文件有两列,即x,f(x)
和x,g(x)
. 我假设行数和 x 的值是相同的。而你“只是”想要f(x)
与g(x)
. 但这与绘图不同f(g(x))
(如您最初的问题)。在后一种情况下,您可能需要插值。
@Christoph 已经指出了一个使用 awk 合并到文件的简单解决方案。如果您没有或不想使用 awk,这里有一个有点麻烦的 gnuplot-only解决方案。
- 将文件 1:1 加载到数据块(请参阅gnuplot: 将数据文件 1:1 加载到数据块中,尽管仍然没有完全回答)
- 删除行尾字符。这取决于操作系统。对于 Windows,我必须将
\r
其作为行尾字符(由于某种原因不是\r\n
)。目前,我无法测试 Linux 和 MacOS。 - 打印/追加行到一个新的数据块
数据:
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
推荐阅读
- c++ - 在 Sublime text 3 中编译甚至简单的 C++ 程序时出错
- android - 在我的 Android 应用中查询应用内购买
- python - XML 到字典提取
- python - DRF, "required": "此字段为必填项。"
- outlook - 无法在 POP/IMAP 服务器的 Outlook 中看到商店图标
- javascript - 接口和抽象类(JS)的区别
- javascript - 如何从html接收js函数中的值
- python - 尝试通过节点编辑器删除 RenderSetupLayer 节点时出现渲染设置错误
- ios - 如何使用 RxSwift 订阅 UIButton isSelected 更改?
- c# - 这件事的背景是什么?