【问题标题】:Gnuplot interpretes locale decimal separator only in the first data lineGnuplot 仅在第一行数据中解释语言环境小数点分隔符
【发布时间】:2019-02-07 06:38:05
【问题描述】:

我的数据文件是

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

【问题讨论】:

    标签: gnuplot


    【解决方案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
    

    结果:

    【讨论】:

    • 谢谢。我在@Ethan 的帖子中找到了一个解决方案。我是 Gnuplot 的新手,但绝对可以很好地找到解决方法。已经有三个了,都适合我。
    【解决方案2】:

    "set decimalsign" 只控制输出,不控制输入。 输入由“set locale”控制。我无法测试这个,因为我没有安装你的语言环境,但它应该可以做

    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 问题跟踪器的错误报告。

    【讨论】:

    • 感谢您的回答,但这并没有帮助。在手册中指出,set decimalsign "," 控制输出并仅影响 gprintf() 行为(确实如此)。但是 set decimalsign localesprintf() 控制输入和输出。奇怪的是,第一行解释正确。我尝试更改行顺序,甚至添加标题。在所有情况下,第一个数据行都被正确解释。
    • 是的,这个例子有效。尝试使用 gprintf() 代替 sprintf(),但结果相同。最后我找到了明显的解决方案:(1)输入中的点,(2)设置小数点“,”,(3)grprintf() 用于输出和连接用于复杂输出。无论如何,主要的是输出,任何人都看不到输入。
    猜你喜欢
    • 2013-12-27
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多