Я пытаюсь создать оболочку для gnuplot на основе Julia, чтобы автоматизировать мои графики. Моя цель - дать Джулии имена файлов для печати, тип стиля линии, который я хочу использовать, и столбец для построения. Например, если у меня есть файлы test1
и test2
, оба с 3 столбцами и заголовками «время, COL1, COL2» и настраиваемыми стилями линий 1 и 2, я бы написал это:
gnuplot -c gnuplot-script.gnuplot "test1 test2" "COL1 COL2" "1 2"
Чтобы построить график зависимости времени от COL1 от test1
и времени от COL2 от test2
, используя стили линий 1 и 2, соответственно, выбранные пользователем. Однако что, если мне нужно время против COL1 with points
и время против COL2 with lines
?
Я знаю, как сделать это вручную, но как я могу сделать это автоматически, учитывая, что количество файлов может быть любой номер? Я пробовал несколько способов.
1.
Я пробовал использовать do for
l oop вот так:
nplots = words(ARG1)
do for [i=1:nplots] {
file = word(ARG1,i)
col = word(ARG2,i)
styl = word(ARG3,i)+0
# I have 10 custom line styles and all above 4 should be continuous line
if (styl>4) {
points_lines = "with lines"
} else {
points_lines = "with points"
}
plot file using "time":col @points_lines ls styl title col
}
Этот подход создает независимый windows, а не один график, и мне нужен единственный график.
2.
Я пробовал использовать подстановку макросов, например:
nplots = words(ARG1)
array files[nplots]
array cols[nplots]
array styles[nplots]
array points_lines[nplots]
do for [i=1:nplots] {
files[i] = word(ARG1,i)
cols[i] = word(ARG2,i)
styles[i] = word(ARG3,i)+0
if (styles[i]>4} {
points_lines[i] = "lines"
} else {
points_lines[i] = "points"
}
}
plot for[i=1:nplots] files[i] using "time":cols[i] @points_lines[i] ls styles[i] title cols[i]
Но подстановка макросов принимает только скалярные переменные, а не элементы массива. Позже, после дальнейшего чтения, я узнал, как именно работает подстановка макросов, и понял, что этот способ никогда не сработает.
Я почти уверен, что могу автоматически сгенерировать строку со всей командой построения, например:
plot_command = "plot file1 using "time":"col" points_lines1 ls styles1, ..."
eval plot_command
Но этот подход кажется трудоемким, и управление всеми исключениями, которые я хочу ввести, совсем не простое.
Есть ли лучший подход или это мой единственный шанс создать строку программно, а затем eval
это?
Заранее спасибо