Gnuplot仅在第一条数据行中解释区域设置小数点分隔符

时间:2019-02-05 21:39:46

标签: gnuplot

我的数据文件是

1,1
1,2
1,3

我尝试使用以下脚本进行绘制

set terminal pngcairo size 600,300 enhanced font "Calibri,18"
set output 'demo_err.png'

set xr [-1:3]
set yr [-1:+1]

#decimal separator in Russia is comma
set decimalsign locale "Russian_Russia.1251"

plot "demo_err.csv" u ($0):(0):(sprintf("%.1f", $1)) w labels,\

Gnuplot result

如您所见,第一个标签可以,但是第二个和第三个标签的分数显示为0。我在做什么错了?

Gnuplot版本是5.2.6

2 个答案:

答案 0 :(得分:1)

“设置十进制符号”仅控制输出,而不控制输入。 输入由“设置区域设置”控制。我无法进行测试,因为我没有安装您的语言环境,但是应该可以做到

set locale "Russian_Russia.1251"
set decimalsign locale "Russian_Russia.1251"

plot "demo_err.csv" u ($0):(0):(sprintf("%.1f", $1)) w labels

[编辑]我现在使用其他语言环境重现了该问题。发生的情况是,每次调用sprintf时,它都会在进入时设置语言环境,并在退出时将其重置为“ C”。如果sprintf出现在gnuplot命令行上,这正是您想要发生的情况。但是,如果在评估“使用”规范期间调用它,则会破坏下一个数据输入读取操作的状态。您的简单测试用例的一种变通方法是避免在“使用”规范中使用sprintf:

plot "demo_err.csv" u ($0):(0):(stringcolumn(1)) w labels

我不知道通过避免在plot命令的“ using”子句中使用sprintf,对于您的完整用例是否可以实现等效的解决方法。同时,我将在gnuplot问题跟踪器上提交错误报告。

答案 1 :(得分:1)

如果您不能等到错误修复后再使用@Ethan的stringcolumn(1)的建议是不够​​的,因为您“绝对”需要例如格式"%.3f",您可以使用公式来模拟sprintf("%.3f",x)。嗯,缺点是...它不能四舍五入。

### sprintf("%.nf",x) "replacement" with decimalsign locale ','
reset session

$Data <<EOD
1
-2,34567
123,45
5,6
7,8867
EOD

set locale "Russian_Russia.1251"
set decimalsign locale "Russian_Russia.1251"

f(s,n) = ((s).',0000000'[sgn(strstrt(s,','))+1:])[1:(strstrt(s,',')==0 ? strlen(s)+n+1 : strstrt(s,',')+n)] 

set xrange[0.5:1.5]
set yrange[-0.5:5]
n = 3
plot $Data u (1):0:(f(stringcolumn(1),n)) w labels

### end of code

结果:

enter image description here