Мне нужно вычислить новые значения в цикле for в gnuplot. Как я могу вставить результаты из $Data? Я получаю сообщение об ошибке "за именем блока данных должен следовать << EODmarker".
do for [selected_label in LABELS] {
set table $Data
plot '' index group using ( @sel ):( @corrected_volume ) with table
unset table
$Temp = $Temp . $Data
}
print $Temp
@theozh: Да, мне нужно объединить несколько блоков данных, которые я вычисляю в цикле for.
Проверьте help table
. Вы можете добавить к блоку данных.
Я не знаю деталей и зависимостей вашего скрипта, но посмотрите пример ниже. Надеюсь, поможет. Кстати, вы также можете использовать
set print $Temp append
print "something"
set print
Скрипт:
### append to an existing datablock
reset session
$Temp <<EOD
1 4
2 5
3 6
EOD
set table $Temp append
do for [i=1:3] {
set samples 3
set xrange [0:2]
plot '+' u ($1*i):(($1*i)**2) w table
}
unset table
print $Temp
### end of script
Результат:
1 4
2 5
3 6
0 0
1 1
2 4
0 0
2 4
4 16
0 0
3 9
6 36
Добавление:
Вы можете имитировать команду вставки Linux только в gnuplot. Вы индексируете строки блока данных (индекс основан на 1), удаляете последний символ (который является новой строкой \n
), объединяете его с другой строкой и печатаете в новый блок данных. Вам нужно убедиться, что вы добавляете не больше строк, чем есть в исходном блоке данных.
Скрипт: (требуется gnuplot>=5.2.0 из-за индексации блоков данных)
### mimic Linux' paste with gnuplot only
reset session
$Temp <<EOD
1 4
2 5
3 6
EOD
set print $Temp2
do for [j=0:2] {
tmp_line = ''
do for [i=1:3] {
tmp_line = tmp_line.sprintf(" %g %g", j*i, (j*i)**2)
}
print $Temp[j+1][1:strlen($Temp[j+1])-1].tmp_line
}
set print
print $Temp2
### end of script
Результат:
1 4 0 0 0 0 0 0
2 5 1 1 2 4 3 9
3 6 2 4 4 16 6 36
Дополнение 2:
Следующее имитирует «вставку» Linux с plot ... w table
в цикле. Это немного уродливо и требует третьего блока данных $Temp3
.
После добавления $Temp2
к $Temp
в $Temp3
вы перезаписываете $Temp
на $Temp3
и начинаете заново для следующей итерации. На основе вашего подробного сценария это может быть упрощено.
С символом новой строки происходят некоторые особые вещи, которые я не совсем понимаю. Итак, видимо, вам нужно пропустить последний символ строки блока данных, но только в первый раз (i==1
). Кроме того, заставьте разделитель файлов данных быть пробелом при записи в таблицу, иначе это будет TAB
. Смешанные разделители столбцов не очень хороши, но gnuplot также справится с этим, если у вас есть set datafile separator whitespace
, что является настройкой по умолчанию.
Скрипт: (требуется gnuplot>=5.2.0 из-за индексации блоков данных)
### mimic Linux' paste with gnuplot only
reset session
$Temp <<EOD
1 4
2 5
3 6
EOD
do for [i=1:3] {
set table $Temp2 separator " "
set samples 3
set xrange [0:2]
plot '+' u ($1*i):(($1*i)**2) w table
unset table
set print $Temp3
do for [j=1:|$Temp2|] {
print $Temp[j][1:strlen($Temp[j])-(i==1)].$Temp2[j][1:strlen($Temp2[j])]
}
set print $Temp
print $Temp3
set print
}
print $Temp
### end of script
Результат:
1 4 0 0 0 0 0 0
2 5 1 1 2 4 3 9
3 6 2 4 4 16 6 36
Это похоже на результаты «кошки» в Linux. Можно ли имитировать «вставку», чтобы все столбцы были перечислены рядом?
@magfan да, можно. Смотрите обновленный ответ.
Это близко. Единственная проблема по-прежнему заключается в том, что мне нужно читать данные в команде построения графика, чтобы иметь доступ к столбцам, значения которых мне нужны для вычислений.
@magfan, ну, тоже можно... но получается немного некрасиво.
Но это решает мою проблему и может быть дополнено многими другими блоками данных.
@magfan, возможно, в зависимости от общей картины (у меня нет вашего полного сценария), также может быть удобно работать с массивами в качестве еще одного варианта.
Давайте продолжим обсуждение в чате.
Это не минимальный воспроизводимый пример (stackoverflow.com/help/minimal-reproducible-example). Почему тег
google-maps-markers
? Кажется, это чистый вопрос gnuplot. Итак, вы хотите добавить блок данных к другому блоку данных?