Рекурсивно изменять тип графика (с линиями, с точками) - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать оболочку для 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 это?

Заранее спасибо

1 Ответ

0 голосов
/ 09 мая 2020

Я не уверен, но думаю, вы не можете изменить стиль построения с with points на with lines в команде построения с помощью макроса @ (по крайней мере, мне не удалось). Но вы можете использовать стиль построения with linespoints вместе с linestyle, чтобы он выглядел как with points или with lines. Очевидно, что установить pointsize 0 только для получения строк. Однако установка linewidth 0 для получения только очков не работает, как я только что узнал здесь: gnuplot: почему ширина линии 0 не равна нулю? . Вместо этого используйте linetype -2. В какой-то момент вам все равно придется определить свои 10 стилей линий.

Код:

### change between plotting styles  'with points' and 'with lines' programmatically
reset session

PlotCount = words(ARG1)
File(i) = word(ARG1,i)
Col(i) = word(ARG2,i)
Style(i) = int(word(ARG3,i))

set style line  1 lt -2 pt 7 lc rgb "red"
set style line  2 lt -2 pt 7 lc rgb "green"
set style line  3 lt -2 pt 7 lc rgb "blue"
set style line  4 lt -2 pt 7 lc rgb "magenta"
set style line  5 lt  1 ps 0 lc rgb "yellow"
set style line  6 lt  1 ps 0 lc rgb "cyan"
set style line  7 lt  1 ps 0 lc rgb "orange"
set style line  8 lt  1 ps 0 lc rgb "olive"
set style line  9 lt  1 ps 0 lc rgb "violet"
set style line 10 lt  1 ps 0 lc rgb "pink"

plot for [i=1:PlotCount] File(i) u "time":Col(i) w lp ls Style(i) title File(i)
pause -1
### end of code

Из консоли gnuplot введите:

call "myScript.gp" "test1 test2" "COL1 COL2" "1 6"

или в вашей операционной системе:

gnuplot.exe -c "myScript.gp" "test1 test2" "COL1 COL2" "1 6"
...