我正在使用以下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
所以显然问题在于将条件语句与字符串列同时使用。任何一个单独使用都可以正常工作。
sprintf("%d",$1)
不起作用。使用sprintf("%s",$1)
也不行。我是否漏掉了什么东西? - mgilson(($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