从两个使用不同分隔符的数据集绘图

10
我需要绘制来自 .csv 文件和空格分隔文件的数据。两组数据需要出现在同一张图上。

data1.dat

 #t   y
  1   1
  2   1
  3   1

并且

data2.csv

 #t,y
  1,2
  2,2
  3,2

通常情况下,如果两个数据集都是 .csv 格式,我会执行以下操作:

 set datafile separator ','
 plot 'data1.csv' using 1:2,'data2.csv' using 1:2

有没有办法在绘图语句中包含分隔符的设置?
plot 'data1.dat' using 1:2,'data2.csv' using datafile separator ',' using 1:2

以上代码无效,我尝试了许多不同的变化……但都没有成功。

3个回答

6
您可以给set datafile separator指定多个字符,例如您的情况下是", "。这些都被单独视为分隔符。(制表符可以用"\t"表示,需要在字符串周围加上双引号!)
$dat << EOD
1 2,4
2 2,5
3 1,6
4 4,4
EOD
set xr [0.5:4.5]
set dataf sep ", "
plot $dat us 1:2:3 w yerrorbars

请注意,显式分隔符每个都计为一个分隔符。使用设置数据分隔符", "的"4, 4"将被解析为"三列,第二列是缺失值"。如果您在一个图中有不兼容的格式,则可以使用set table $<name>为每个子图导入带有自己分隔符设置的数据(请参见"help datablocks")。
如果您的数据文件具有非常困难的格式:gnuplot的using说明符接受一个libC scanf()格式字符串。
plot "-" us 1:2 "%lf,%lf"
1,2
2,3
3,4
e

您可以在plot命令中为每个文件提供不同的格式字符串。请注意,gnuplot只接受“double” fp数字作为输入,因此您必须使用%le%lf说明符。

请查看help using examples,这里是格式的完整描述:http://www.cplusplus.com/reference/cstdio/scanf/


真的吗?如果我尝试使用多个字符作为分隔符,我会得到“<separation_char>后面的额外字符”吗? - Benjamin W.
1
在4.6版本中引入了使用多个分隔符的功能,我猜你正在使用此变更之前的版本。顺便说一句:如果你想尝试的话,Ubuntu有一个gnuplot5包。 - Karl
@Karl,我无法使用 ", " 或 gnuplot 5.0 或 gnuplot 5.4.1 成功。在我看来,虽然您可以定义多个分隔符,例如 ",;|",但不能与空格组合使用。 - theozh
@theozh 嗯,我刚刚添加的示例在我的机器上完美运行。如果您的数据中有制表符而不是空格,则必须将“\t”添加到字符字符串中。而且不要尝试将带有制表符的内容复制并粘贴到Windows上的(w)gnuplot中,因为这是一个已知的错误。 - Karl
1
@Karl 我猜我现在找到了。你的例子之所以有效,是因为你只有 一个 空格。在我的例子中,我在开头有多个空格和多个空格作为列分隔符。我怀疑如果你指定 set datafile separator ", " 它将接受 仅仅 一个空格作为分隔符,但不会接受多个空格。也许你可以尝试多个空格并确认或证明我的怀疑。 - theozh
显示剩余4条评论

3
据我所知,没有一种方法可以指定分隔符。但是,如果您在一个符合POSIX标准的环境中(并且您的gnuplot支持管道——大多数都支持),您可以很容易地将工作委托给awk
plot 'data1.dat' using 1:2,\
     "<awk -F, '{print $1,$2}' data2.csv" using 1:2

我最终从.csv文件中删除了逗号并插入了空格。您的建议是否仅从.csv文件中创建没有逗号的新文件?我以前从未使用过awk - kxk7607
@kxk7607 -- 基本上,awk 根据字段(-F,)将文件拆分为列,然后打印所请求的列。 - mgilson
如果一个列是带有空格和逗号的标签,而我的另一个数据文件是以空格分隔的,不适合使用awk管道怎么办?啊,我只需要根据这篇文章在我的标签周围加上双引号:https://dev59.com/w27Xa4cB1Zd3GeqPtsQi - tommy.carstensen
这个答案已经过时了。 - Karl

0
不仅仅是为了“复古”乐趣,而且对于当前的gnuplot版本,我想这可能是唯一的(?)仅限gnuplot解决方案,适用于所有版本,甚至是在OP提出问题之前的版本。
“诀窍”是:如果你set datafile separator ","并读取第一个(也是唯一的)字符串列(来自一个空格分隔的文件),即strcol(1)将包含整行。现在,您可以使用word()简单地拆分字符串,并使用real()将其转换为浮点数。

如果您的原始数据在逗号后至少有一个空格,

 1, -0.2
 2, -0.1
 3,  0.0

如果保留分隔符为空格,则数据将正确绘制,因为在数字解释期间将忽略第一列数据后的逗号。

尽管对于新版本的gnuplot(>=4.6.7,2015年4月),您可以定义几个分隔符,但是,这不会像您想象的那样工作,因为

set datafile separator ", "

将把每个空格解释为列分隔符。 因此,如果您有未定义和可变数量的空格,则绘图命令将失败。

无论如何,这里是“始终”有效的解决方案:

数据:

SO14262760_1.dat(具有可变数量的空格)

 1  -0.1
 2   0.0
 3  +0.1

SO14262760_2.dat(在,后面没有或有一些空格)

 1,-0.2
 2,-0.1
 3, 0.0
脚本:(适用于gnuplot>=4.4.0,2010年3月)
### different column separators in two files with one plot command
reset

FILE1 = "SO14262760_1.dat"
FILE2 = "SO14262760_2.dat"

set datafile separator ","
myCol(n) = real(word(strcol(1),n))

plot FILE1 u (myCol(1)):(myCol(2)) w lp pt 7 lc rgb "red", \
     FILE2 u 1:2 w lp pt 7 lc rgb "blue"
### end of script

结果:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接