gnuplot,如何仅标记特定的点?

8

我正在使用以下gnuplot命令创建一个图表:

#!/bin/bash
gnuplot << 'EOF'
set term postscript portrait color enhanced
set output 'out.ps'

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $1:'aaa') w labels

EOF

假设 data_file 的内容如下:

  O4     -1.20     -0.33     -5.20  
O9.5     -1.10     -0.30     -3.60  
  B0     -1.08     -0.30     -3.25  
B0.5     -1.00     -0.28     -2.60  
B1.5     -0.90     -0.25     -2.10  
B2.5     -0.80     -0.22     -1.50  
  B3     -0.69     -0.20     -1.10  

我希望gnuplot能够标记所有点,并使用列1中找到的字符串进行标记,但当列4等于-3.60时,我想要aaa字符串。但是我得到的结果是,$ 4=-3.60的数据点被正确标记为aaa,但其余的点根本没有被标记。
更新:gnuplot使用条件语句在标签中显示数字没有问题,也就是说,任何列除了1都可以正确地显示为每个点的标签并遵守所施加的条件。也就是说,该行将列2(数字)作为点标签显示,以符合所施加的条件。
plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? $2:'aaa') w labels

更新2:如果我将其作为整体绘制,即不使用条件语句,它也没有问题在绘制列1作为点标签。也就是说,这条线可以正确地绘制所有1(字符串)中的点标签:

plot 'data_file' u 3:2 w points , '' u 3:2:1 w labels

所以显然问题在于将条件语句与字符串列同时使用。任何一个单独使用都可以正常工作。
2个回答

5
也许更加简洁的方式是这样的。似乎如果不将计算出来的数字转换为字符串,标签无法显示它。
#!/bin/bash
gnuplot << 'EOF'
set term postscript portrait color enhanced
set output 'out.ps'

plot 'data_file' u 3:2 w points , '' u 3:2:($4!=-3.60 ? sprintf("%d",$1):'aaa') w labels

EOF

1
这个解决方案对我没用。我得到的只是一个标签('aaa'),它代表了 OP 希望被删除的那个标签...如果第一列中的数据不是整数,则使用 sprintf("%d",$1) 不起作用。使用 sprintf("%s",$1) 也不行。我是否漏掉了什么东西? - mgilson
我没有gnuplot来检查,但如果第一列的第一行不包含数字,则可能会有所不同(在这种情况下,整个sprintf事情就不需要了)。 我承认我尝试过我的一个数据文件,而不是OP的数据文件...我还会尝试 (($4!= -3.60)?''.$1:'aaa' 仅在需要时强制进行字符串转换。 - T. Verron
以下代码 ($4 ne '-3.60' ? stringcolumn(1):'') (使用stringcolumn比使用字符串连接更好)可以工作,但这个测试非常脆弱,因为它在 -3.60 上进行了字符串比较,而不是浮点数比较(例如,-3.6 仍然会在那里放置一个标签)。问题在于,由于gnuplot正在绘制标签,它期望该字段中有字符串(似乎在输入时将第4列转换为字符串)。这也使得输出中留下了(空的)字符串,从而使其膨胀。最好的解决方案是我下面提出的方案(在我看来)——只需移动过滤器即可正常工作。 - mgilson
иҜ·жіЁж„ҸпјҢ($4!=-3.60)? ''.$1:'aaa' дёҺжӮЁзҡ„ sprintf зүҲжң¬дә§з”ҹзӣёеҗҢзҡ„з»“жһңгҖӮ - mgilson

3

你是想要这个吗?

#!/bin/bash

gnuplot << 'EOF'
set term postscript portrait color enhanced
set output 'out.ps'
plot 'data_file' u 3:2 w points , \
     '' u (($4 == -3.60)? 1/0 : $3):2:1 w labels

EOF

我在这里所做的只是将第四列等于-3.6的(x)点设置为NaN (1/0)。由于gnuplot忽略这些点,所以一切都很好。我认为你的脚本问题在于你正在过滤gnuplot期望输入字符串的列——尽管我还没有玩够来验证这一点。我只是将过滤器切换到gnuplot期望数字(x位置)的列,它就可以正常工作了。


根据OP的要求,如何实现类似于这样的功能?using 3:4:(sprintf("%g",($6 eq "swim") ? (tc lt 4):(tc lt 1))) with labels(我在这里遇到了错误:无效的表达式和需要括号...) - bonCodigo

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