Вот одна часть моего сценария:
if (PNG == 1) {
set terminal png size 1024,768 font "Arial,11"
SAVE_AS = FILENAME.'.png'
print " - Create file: ".SAVE_AS
set output SAVE_AS
plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
}
if (SVG == 1) {
set term svg size 600,400 dynamic font 'Arial,11'
SAVE_AS = FILENAME.'.svg'
print " - Create file: ".SAVE_AS
set output SAVE_AS
plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
}
Как вы можете видеть, график DATA_FILE... встречается в моем коде дважды: один раз в PNG-части и один раз в SVG-части. Можно ли поместить код в какую-то переменную и потом ссылаться на эту переменную.
Вот некоторый псевдокод:
a = DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
if (PNG == 1) {
...
plot a
}
if (SVG == 1) {
...
plot a
}
Редактировать:
Вот весь скрипт:
# Run as follows:
#
# gnuplot.exe -e "DATA_FILE='<path/to/root/>/input/PEDS_1.csv'; PIC_FOLDER='<path/to/root/>/output';
# SEQ='PEDS_1'; X_MAX=50; PNG=1; SVG=1" <filename>.gplt
#
# The variables are as follows:
# DATA_FILE : The output CSV file
# PIC_FOLDER: The full path of the folder, where the created graphs should be saved
# SEQ : The name of the Sequence
# X_MAX : The maximum simulation time (in hours) to be displayed. Default value is 50:
# PNG : Set 1 if a PNG graph should be created. Default value is 0.
# SVG : Set 1 if a SVG graph should be created. Default value is 0.
# Set default values
if (!exists('X_MAX')){
X_MAX = 50
}
if (!exists('PNG')){
PNG = 0
}
if (!exists('SVG')){
SVG = 0
}
# Get the filename of this gnuplot script
SCRIPT_FILENAME = ARG0[strlen(ARG0)-8:strlen(ARG0)-5]
# Set the filename (without extension)
FILENAME = PIC_FOLDER.'/'.SEQ.'___'.SCRIPT_FILENAME
set encoding utf8
set datafile separator ','
set key autotitle columnhead
set title "KPDS «".SEQ."»" noenhanced
# x-Axis
set xlabel 'Time (h)' offset -2,0,0
set xrange [0:X_MAX]
set mxtics 10
# y-Axis
set ylabel 'Power (MW)' textcolor "red" offset 2,0,0
set yrange [0:100]
set ytics textcolor "red"
set mytics 10
# y2-Axis
set y2label 'Pressure (bara)' textcolor rgb "blue" offset -2,0,0
set y2range [0:100]
set y2tics textcolor rgb "blue"
set my2tics 10
# Grid
set grid linetype 2 linewidth 0.2 linecolor rgb '#DCDCDC'
set grid mxtics
set grid mytics
# Legend
set key off title
if (PNG == 1) {
set terminal png size 1024,768 font "Arial,11"
SAVE_AS = FILENAME.'.png'
set output SAVE_AS
plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1,\
fname using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x1y2
}
if (SVG == 1) {
set term svg size 600,400 dynamic font 'Arial,11'
SAVE_AS = FILENAME.'.svg'
set output SAVE_AS
plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1,\
fname using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x1y2
}
Извините за первое сообщение, где я его не предоставил.
Я не знаком с Gnuplot, но не могли бы вы переместить общий код после операторов if, чтобы уменьшить дублирование?
if (PNG == 1) {
set terminal png size 1024,768 font "Arial,11"
SAVE_AS = FILENAME.'.png'
print " - Create file: ".SAVE_AS
set output SAVE_AS
}
if (SVG == 1) {
set term svg size 600,400 dynamic font 'Arial,11'
SAVE_AS = FILENAME.'.svg'
print " - Create file: ".SAVE_AS
set output SAVE_AS
}
plot DATA_FILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
DATA_FILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
Если вы хотите написать команду построения графиков только один раз, но получить ее в одном или нескольких различных выходных форматах, вы можете использовать команду replot
(отметьте help replot
). Однако это работает, только если у вас нет мультиграфического графика (проверьте help multiplot
). Для мультиплотов вам нужно сделать это по-другому.
Мой терминал по умолчанию — wxt
.
Таким образом, он сначала построит график в терминале wxt
, а если PNG==1
— еще и в PNG-файл, а если SVG==1
— еще и в SVG-файл.
Редактировать:
Если вам не нужен график в терминале по умолчанию, вы можете установить терминал на unknown
. Это ничего не построит, но выдаст предупреждение в консоли gnuplot, которое, однако, вы можете игнорировать.
Plotting with an 'unknown' terminal.
No output will be generated. Please select a terminal with 'set terminal'.
Сценарий: (Я предпочитаю полные и полностью работающие сценарии копирования и вставки)
### create several output files with identical plot command
reset session
BASENAME = "SO78571143"
PNG = 1
SVG = 1
set term unknown
plot sin(x), cos(x) # your actual plot command
if (PNG == 1) {
set term pngcairo size 640,348 font "Arial,11"
OUTPUT = BASENAME.'.png'
print " - Create file: ".OUTPUT
set output OUTPUT
replot
}
if (SVG == 1) {
set term svg size 600,400 dynamic font 'Arial,11'
OUTPUT = BASENAME.'.svg'
print " - Create file: ".OUTPUT
set output OUTPUT
replot
}
set output # close output file
### end of script
Результат: вывод в формате PNG и аналогичный вывод в формате SVG.
Ваше решение работает нормально. Знаете ли вы, как подавить открытие окна с изображением графика, которое происходит после построения DATA_FILE...?
@ped см. измененный ответ.
Спасибо. Вы абсолютно правы: я мог и должен был создать минимальный пример. Пожалуйста извините меня.
@ped, не волнуйся. Иногда важно иметь сценарий и данные для воспроизведения ошибки или определенного поведения. Возможно, не в вашем случае, но не помешает получить какой-то результат без необходимости сначала создавать какие-то значимые данные и завершать фрагмент сценария. Я хочу убедиться, что все сценарии, которые я публикую здесь, работают и протестированы. Итак, проблема решена, вопрос дан? Если да, то примите один из ответов, который решил вашу проблему.
Ответ Gnuplot версии 6 (не применимо к более ранним версиям)
function $myplot(filename) <<EOF
plot filename using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb "red" axis x1y1,\
filename using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb "blue" axis x1y2
EOF
if (PNG == 1) {
...
evaluate $myplot(DATAFILE)
} else if (SVG == 1) {
...
evaluate $myplot(DATAFILE)
}
Ответ Gnuplot версии 5
Более ранние версии gnuplot не поддерживали функциональные блоки, но позволяли использовать команду evaluate
для выполнения строковой переменной или функции со строковым значением. Строка ограничена одной строкой текста.
a = "plot DATAFILE using ($1/3600.0):(column('POW-FP+D')) with lines title 'POW-FP+D' linecolor rgb 'red' axis x1y1, DATAFILE using ($1/3600.0):(column('PR-Core')) with lines title 'PR-Core' linecolor rgb 'blue' axis x"
if (PNG == 1) {
...
evaluate a
} else if (SVG == 1) {
...
evaluate a
}
Второе решение (ответ Gnuplot версии 5) работает. Но мне не нравится ограничение «Строка ограничена одной строкой текста», потому что код сложнее поддерживать.
Я использую gnuplot 6. К сожалению, я получил evaluate $myplot(DATA_FILE)
ошибку undefined value
. Я знаю, что вы назвали переменную DATAFILE
, но в моем коде это DATA_FILE
.
Пожалуйста, покажите точные команды, которые вы использовали. Я предполагал что-то вроде DATA_FILE = "somedir/somename.dat"; evaluate $myplot(DATA_FILE)
. Функция ожидает строку; совершенно не важно, как называется эта строка.
Я сделал еще несколько отладочных результатов. Код входит в функцию, и переменная filename
имеет то же значение, что и DATA_FILE
, что является допустимым путем. Вот вывод: Inside $myplot: c:\Users\...\01_Parameters/AELS_1.csv
(я сократил путь к файлу только с помощью ...). Пока я буду придерживаться другого вашего подхода, но интересно понять, почему он не работает.
Я думаю, что вам нужен
macro
. Gnuplot поддерживает расширение строковых переменных в командах. Напримерvar = "using 1:3"; plot 'data.txt' @var
. Однако var должна быть постоянной строкой!