我的数据文件是
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,\
如您所见,第一个标签可以,但是第二个和第三个标签的分数显示为0。我在做什么错了?
Gnuplot版本是5.2.6
答案 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
结果: