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

У меня есть несколько файлов с одинаковым именем data в разных папках с именами folder1, folder2, folder3, я хочу отобразить столбцы 1 и 2 всех файлов в разных папках одновременно , Другими словами, из корня, где находится folder1..3, я не хочу использовать:

p 'folder1 / data' u 1: 2, 'folder1 / data' u 1: 3

и

p folder2 / data 'u 1: 2,' folder2 / data 'u 1: 3

и снова для folder3 и 28 других папок, у меня в реальном случае. Есть ли в Gnuplot команда for или какая-либо связанная с ней команда, которая позволяет мне одновременно выводить все файлы data из разных папок, предпочтительно в разные окна?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Взгляните на help for, чтобы узнать о циклах в gnuplot. Вроде как

plot for [i=1:3] "folder".i."/data" u 1:2, for [i=1:3] "folder".i."/data" u 1:3

может быть все, что вам нужно.

Возможность автоматического создания графиков для разных файлов в разных окнах, вероятно, зависит от выбранного вами выходного терминала. Для x11 вы, вероятно, могли бы сделать что-то вроде

do for [i=1:3] {
    set term x11 i
    plot "folder".i."/data" u 1:2, "" u 1:3
}

(не проверено).

0 голосов
/ 06 июля 2018

gnuplot может обрабатывать столько файлов, сколько вам нужно в одной команде.

Просто введите команду plot, разделяющую спецификацию каждого файла и столбца запятой (как вы начали делать выше)

plot \
"folder1/data" using 1:2,
"folder1/data" using 1:3,
"folder2/data" using 1:2,
"folder2/data" using 1:3,
"folder3/data" using 1:2,
"folder3/data" using 1:3

Обычно каждая команда plot выводит вывод в отдельном окне (это зависит от того, как вызывается gnuplot - в отдельном процессе или нет).

При вызове из сценария оболочки вы можете порождать отдельные подоболочки для получения вывода в отдельных окнах или в рамках C-программы вы можете fork разделять процессы для одной и той же цели.

Вы также можете использовать multiplot, см. Multiplot - размещение графиков рядом друг с другом «Gnuplotting

Вы также можете найти ответы на некоторые части своего вопроса здесь gnuplot: отображение данных из нескольких входных файлов на одном графике


редактировать на основе комментариев

Хорошо, теперь, как я понимаю, вы хотите автоматизировать создание файла печати из списка каталогов с именем folderXX (где XX может быть что угодно) ниже текущего каталога, и в каждой папке будет файл с именем data, где вы хотите построить первый график для каждого из 2-го и 3-го столбцов, затем вы можете создать временный файл графика (скажем, tmp.plt), циклически перебирая список folderXX (вы можете настроить глобализацию на необходимо) и выводить команды построения по мере использования с помощью простого перенаправления.

Например, что-то вроде следующего:

#!/bin/bash

## truncate tmp.plt and set line style
echo -e "set style data lines\nplot \\" > tmp.plt

cnt=0   ## flag for adding ',' line ending

## loop over each file
for i in folder*/data; do
    if ((cnt == 0)); then       ## check flag (skips first iteration)
        cnt=1                   ## set flag to write ending comma
    else
        printf ",\n" >> tmp.plt             ## write comma
    fi
    printf "\"$i\" using 1:2,\n" >> tmp.plt ## write using 1:2
    printf "\"$i\" using 1:3" >> tmp.plt    ## write using 1:3 (no ending)
done
echo "" >> tmp.plt              ## write final newline

( примечание: echo и printf чередуются, чтобы получить желаемое поведение выхода для продолжения строки)

При запуске в каталоге, содержащем folder1, folder2, folder3, folder4, каждый из которых содержит файл data, например,

$ tree
.
├── folder1
│   └── data
├── folder2
│   └── data
├── folder3
│   └── data
├── folder4
│   └── data

это приведет к tmp.plt графическому файлу, который можно затем вызвать с помощью gnuplot -p tmp.plt, например,

$ cat tmp.plt
set style data lines
plot \
"folder1/data" using 1:2,
"folder1/data" using 1:3,
"folder2/data" using 1:2,
"folder2/data" using 1:3,
"folder3/data" using 1:2,
"folder3/data" using 1:3,
"folder4/data" using 1:2,
"folder4/data" using 1:3

Это должно быть ближе к тому, что вы искали, основываясь на вашем комментарии.

...