2015-04-30 15 views
7

Chcę zrobić coś podobnego do tego pytania: gnuplot : plotting data from multiple input files in a single graph.Wykreślić wszystkie pliki w katalogu jednocześnie z gnuplot?

Chcę wydrukować jednocześnie wszystkie pliki wszystkie bez konieczności jawnego zapisywania ich nazw. Numery kolumn są takie same dla wszystkich plików. Co mogę zrobić?

Wykonanie plot for [file in *] file u 3:2 nie działa.

Ponadto nie chcę, aby każdy plik miał inną legendę. Wszystkie punkty ze wszystkich plików powinny być traktowane tak samo, jakby wszystkie pochodziły z jednego pliku.

+0

Zobacz np. http://stackoverflow.com/a/26682241/2604213 – Christoph

+0

@Christoph Dzięki +1, to prawie rozwiązuje mój problem.Jednak zredagowałem to pytanie, ponieważ nie chcę, aby każdy plik miał odrębną legendę. – becko

+0

Jaki styl kreślenia chcesz, czy potrzebujesz legendy i do jakiego systemu operacyjnego pracujesz? – Christoph

Odpowiedz

5

Można spróbować czegoś takiego:

a=system('a=`tempfile`;cat *.dat > $a;echo "$a"') 
plot a u 3:2 

używa Linia komend tempfile aby stworzyć bezpieczne, niepowtarzalnych i jednorazowych plik tymczasowy. Wycina wszystkie pliki danych w tym pliku. Następnie echo nazwy pliku, aby mógł go pobrać gnuplot. Gnuplot następnie kreśli rzeczy.

Martwisz się o linie nagłówka? Spróbuj tego:

a=system('a=`tempfile`;cat *.dat | grep "^\s*[0-9]" > $a;echo "$a"') 

Wyrażenie regularne ^\s*[0-9] dopasuje wszystkie linie, które zaczynają z dowolną ilością białych znaków wraz z numerem.

+5

Nie trzeba używać pliku tymczasowego, wystarczy użyć 'plot ' Christoph

+0

Przyjemnie, @Christoph! – Richard

2

Lubię też móc wybierać pliki do drukowania za pomocą symboli wieloznacznych, więc jeśli chcesz, możesz wykonać następujące czynności, chociaż jest wiele sposobów. Utwórz następujący skrypt.

script.sh:

gnuplot -p << eof 
set term wxt size 1200,900 title 'plots' 
set logs 
set xlabel 'energy' 
plot for [ file in "[email protected]" ] file w l 
eof 

zrobić chmod u+x script.sh

Run Like ./script.sh dir/* *.dat

Jeśli trzeba to często alias dla niej i umieścić go w jakimś rozsądnym miejscu :) Cheers/J

5

Jako alternatywę dla odpowiedzi Jonatan, chciałbym wybrać z

FILES = system("ls -1 *.dat") 
plot for [data in FILES] data u 1:2 w p pt 1 lt rgb 'black' notitle 

lub

plot '<(cat *.dat)' u 3:2 title 'your data' 

Pierwsza opcja daje większą elastyczność, jeśli chcesz oznaczyć każdą krzywą. Na przykład, jeśli masz kilka plików o nazwach data_1.dat, data_2.dat, etc., które zostaną oznaczone jako 1, 2, etc., a następnie:

FILES = system("ls -1 data_*.dat") 
LABEL = system("ls -1 data_*.dat | sed -e 's/data_//' -e 's/.dat//'") 

plot for [i=1:words(FILES)] word(FILES,i) u 3:2 title word(LABEL,i) noenhanced 
0

Spróbuj następującą komendę:

gnuplot -e 'plot for [file in system("find . -depth 1 -type f -print")] file u 3:2' 

Uwaga: Dodaj -p, aby zachować okno wykresu.

Powiązane problemy