Gnuplot интерпретирует десятичный разделитель локали только в первой строке данных - PullRequest
0 голосов
/ 06 февраля 2019

Мой файл данных

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

Как вывидите, первая метка в порядке, но во второй и третьей фракциях метки отображается как 0. Что я делаю не так?

Версия Gnuplot - 5.2.6

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Если вы не можете дождаться исправления ошибки и предложения @ 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

0 голосов
/ 06 февраля 2019

«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, это именно то, что вы хотите.Но если он вызывается во время оценки спецификации 'using', это забивает состояние следующей операции чтения ввода данных.Обходной путь для вашего простого тестового случая - избегать использования sprintf в спецификации 'using':

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

. Я не знаю, возможен ли эквивалентный обходной путь для вашего полного варианта использования:избегая sprintf внутри предложения «using» команды plot.Тем временем я отправлю сообщение об ошибке на трекер ошибок gnuplot.

...