Menu Zamknij

Wykresy z gnuplotem

Cel

Nauka tworzenia wykresów przy pomocy programu gnuplot1.

Wymagania

  • instalacja programu gnuplot.

Wprowadzenie

Rozdział ten wydaje się nie pasować do reszty tematyki skryptu, ale celem przewodnim tej pracy jest urozmaicenie nauki programowania poprzez wyjście poza standardowe wejście i wyjście. Czasami pisząc program, chciałoby się przedstawić wyniki w formie graficznej, ale zrobienie tego z poziomu kodu jest zadaniem o tyle złożonym, że może znacząco przerosnąć możliwości piszącego, a główna treść programu zniknie w zawiłościach dodatków. Konsolowy gnuplot pozwala na łatwą konsolidację z wieloma projektami, uruchamiany jako proces potomny lub umieszczany w potoku poleceń.

Gnuplot jest wolnym programem o ogromnych możliwościach służącym do tworzenia wykresów, działającym jednakże z linii poleceń, czyli wymagającym wpisywania komend z klawiatury. Osobom przywiązanym do graficznych interfejsów, zanim pominą dalszy tekst, proponuję jednak przeczytanie do końca chociaż wprowadzenia.

Gdy pracujemy z obrazami, jesteśmy zorientowani graficznie. Dotyczy to nie tylko zawartości, lecz także interfejsu, dlatego praca z plikami zawierającymi grafikę w trybie tekstowym wydaje się nielogiczna i „na siłę”. Nie zawsze jednak wizualne nastawienie jest bardziej wygodne, a może być zdecydowanie mniej efektywne.

Dobrze ilustruje to tworzenie wykresu w rozdziale Rejestrator danych. Dane tekstowe z pliku data.txt musieliśmy zaimportować w programie LibreOffice Calc, zamienić kropki na przecinki, a następnie przedrzeć się przez kreatora tworzenia wykresów. Jeżeli mamy wiele plików, takie działanie może być znacząco uciążliwe. Korzystając z gnuplota, wydajemy jedno polecenie, o ile mamy przygotowany skrypt formatujący, i wykres jest gotowy, czy to będzie z pojedynczego dokumentu, czy z wielu plików, nie ma znaczenia. Także, co jest zaletą, kropka, standardowo będąca w komputerach separatorem części ułamkowej, jest kropką. Nie trzeba będzie więc przetwarzać plików z danymi otrzymanymi podczas obliczeń numerycznych czy w inny sposób wygenerowanych w różnych programach.

Warto próbować działać w linii poleceń. Oprócz łatwości konsolidacji z większymi projektami, szybkości działania, efektywności pracy i możliwości jej zautomatyzowania, dostajemy także możliwość pracy z wieloma plikami jednocześnie. Wyobraźmy sobie, że chcemy dokonać jakiejś modyfikacji plików graficznych lub dźwiękowych (na przykład przetworzyć je do innego formatu, zredukować rozdzielczość itp.) w ilości tysiąca. Otwieranie wszystkich plików po kolei, ich modyfikacja i zamykanie, będzie możliwe tylko dla najwytrwalszych. Sprytniejsi poszukają programu, który potrafi wykonywać podobne modyfikacje grupowo, ale co jeżeli takiego nie ma albo jest bardzo drogi, a nam jest potrzebny tylko jednorazowo? W konsoli jest prosta zasada – jeżeli coś potrafię zrobić raz, to mogę w prosty sposób zrobić to dowolną ilość razy.

Instalacja

W systemach Linux, ze względu na powszechność użycia gnuplota jako standardowego programu rysowania wykresów w wielu programach, instalacja jest bardzo prosta, bo znajduje się on we wszystkich porządnych repozytoriach. Najprawdopodobniej gnuplot jest już zainstalowany, ale gdyby nie był, to w systemach Red Hat, Fedora i pochodnych w linii poleceń jako root wpisujemy:

# dnf install gnuplot

a w systemach rodziny Debian (czyli na przykład najpopularniejszej dystrybucji Linuxa, jaką jest Ubuntu):

# apt-get install gnuplot

Inne dystrybucje korzystające z innych managerów pakietów wymagają być może nieco innych czynności, ale na pewno nie są znacząco trudniejsze.

W systemach Windows konieczne będzie pobranie ze strony sourceforge.net/projects/gnuplot/files/gnuplot/ odpowiednich plików instalacyjnych. Sposób instalacji będzie zależał od pobranej wersji. We wcześniejszych wystarczało rozpakować archiwum, a program gnuplot dostępny był jako plik wykonywalny w katalogu bin pod nazwą wgnuplot.exe. W nowszych wydaniach gnuplot działa pod kontrolą MinGW (Mnimalist GNU for Windows), czyli systemu pozwalającego na korzystanie z narzędzi linuksowych pod Windows.

Wszystkie przykłady tego rozdziału zostały przetestowane w systemie Linux Fedora.

Podstawy gnuplota

Gnuplot jest potężnym programem do tworzenia wykresów 2D i 3D. Warto go poznać chociażby ze względu na możliwości, które oferuje. Pozwala na otrzymanie w zasadzie dowolnie sformatowanego wykresu, chociaż dostosowanie obrazu do własnego wyobrażenia może wymagać nieco wysiłku. Z pewnością internet jest miejscem, gdzie dostaniemy konkretną odpowiedź.

Zasadniczo gnuplot jest interpreterem skryptów specyficznego języka. Jak wiele tego typu programów może pracować w dwóch trybach – interaktywnym i wsadowym. Do trybu interaktywnego mamy dostęp po wpisaniu w linii poleceń:

$ gnuplot

a o jego uruchomieniu powiadomi nas znak zachęty programu:

gnuplot>

Teraz można wpisywać polecenia gnuplota dotyczące zarówno rysowania, jak i formatowania wykresu.

Zakres poleceń gnuplota nie jest duży (w 95% przypadków wystarczy znać plot i set), ale o zawrót głowy może przyprawić ilość opcji dostępnych dla tych poleceń. Na szczęście wszystkie mają pewne domyślne parametry i jeśli żądamy rysowania wykresu o niedookreślonych ustawieniach, gnuplot samodzielnie zdecyduje o formatowaniu.

Najważniejszym poleceniem dla rysowania 2D jest plot, po którym należy podać, co program ma narysować. Jeżeli chcemy, by była to funkcja określona wzorem matematycznym, to możemy napisać ją wprost. Domyślnym argumentem funkcji w gnuplocie jest x. Na przykład wpisanie w trybie interaktywnym:

gnuplot> plot sin(x)

spowoduje wyświetlenie w nowym oknie wykresu funkcji sinus z ustawieniami, które dobrane zostały automatycznie. Na rysunku 1 widać otwartą sesję gnuplota i wykres w odrębnym oknie graficznym.

Rysunek 1. Gnuplot w trybie interaktywnym i wygenerowany przez niego wykres funkcji sinus

Niewielka liczba narzędzi tego okna wynika z tekstowego charakteru sterowania wyświetlaniem, ale pozwala na zapis obrazu do formatu pdf, wektorowego svg, rastrowego png lub skopiowanie do schowka (rysunek 2).

Rysunek 2 Możliwości eksportu wykresu od różnych formatów graficznych z okna Gnuplot Window

Jeżeli mamy życzenie, by na jednym wykresie były dwie zależności, to oddzielamy je przecinkami, ale zanim to zrobimy, zdefiniujemy własną funkcję. Ponieważ w gotowych zależnościach nie ma cotangensa, a chcielibyśmy go wykreślić, to zdefiniujemy go:

gnuplot> ctan(x) = 1 / tan(x)

Teraz wystarczy już tylko wydać polecenie rysowania nowo zdefiniowanej funkcji, aby dostać wynik zaprezentowany na rysunku 3.

gnuplot> plot sin(x), ctan(x)
Rysunek 3. Wykresy dwóch funkcji: sinus i cotangens z automatycznymi ustawieniami

Ponieważ nie podaliśmy żadnych informacji o zakresach argumentów ani wartości, gnuplot próbuje automatycznie dobrać je na podstawie przebiegu funkcji. Jak widać na rysunku nie zawsze mu się to udaje, szczególnie gdy wartości uciekają do nieskończoności może okazać się, że krok argumentu jest zbyt duży, by prawidłowo odwzorować przebieg zmienności. Legenda też została wstawiona automatycznie, ale można ją wyłączyć lub zmienić nazwy. Podobnie jest z dobranymi przez gnuplot kolorami. Można także wyłączyć kolor i używać specjalnych znaczników i stylów na potrzeby czarno-białych publikacji.

Pora na poznanie drugiego ważnego polecenia, czyli set. Po nim następuje opcja mówiąca o tym, co ma ulec ustawieniu. Jeżeli mają to być zakresy wyświetlania, to użyjemy opcji xrange i yrange. Dodatkowo zmienimy podziałkę główną osi x, lepiej dopasowaną do funkcji trygonometrycznych, używając predefiniowanej w gnuplocie stałej pi. Dla przykładu włączymy także siatkę, która jest domyślnie powiązana z podziałkami głównymi.

gnuplot> set xrange [-2*pi:2*pi]
gnuplot> set yrange [-3:3]
gnuplot> set xpics pi
gnuplot> set grid

Zauważmy, że wykres nie zmienił się automatycznie. Nie musimy jednak wywoływać ponownie polecenia plot, co mogłoby być kłopotliwe w przypadku dużej liczby funkcji i opcji. Do przerysowania wykresu służy polecenie replot. Wynik dokonanych modyfikacji jest widoczny na rysunku 4.

gnuplot> replot
Rysunek 4. Poprawiony wykres sinusa i cotangensa

Skrypty gnuplota

Ciągłe wpisywanie poleceń, szczególnie formatujących, nie jest szczytem efektywności, dlatego pracując często z programem, można przygotować sobie pliki tekstowe – skrypty – zawierające wstępne informacje o preferowanych przez użytkownika stylach. Skrypt taki jest zwykłym plikiem tekstowym ze zwyczajowym rozszerzeniem plt lub gp. Przykładowa zawartość takiego pliku, dla danych z poprzedniego wykresu będzie wyglądać następująco:

Listing 1

ctan(x) = 1 / tan(x)
set xrange [-2*pi:2*pi]
set yrange [-3:3]
set xtics pi
set grid
#plot sin(x), ctan(x) #odkomentuj jeżeli potrzeba

W linii 6 na listingu 1 widać zastosowanie komentarza. Wykonanie skryptu może zakończyć się rysowaniem wykresu lub jedynie ustawieniem formatowania. Załadowanie skryptu w uruchomionym trybie interaktywnym gnuplota wymaga użycia polecenia load.

gnuplot> load „skrypt.plt”

Nie trzeba jednak uruchamiać gnuplota, aby wykonać skrypt, wystarczy w linii poleceń wpisać:

$ gnuplot „skrypt.plt”

Oczywiście powinna być w tym przypadku odkomentowana linia 6 w skrypcie 1, bo nie będzie jak wykonać wykresu, ładując w taki sposób same ustawienia. W zależności od ustawień środowiska może się okazać, że w oknie wykresu pojawi się na chwilę działanie gnuplota, po czym szybko zniknie. Aby temu zapobiec, należy gnuplota uruchomić z opcją –persist (lub krótką -p), która pozostawi okno wyjściowe po zamknięciu programu.

$ gnuplot -p „skrypt.plt”

Jest także możliwość, by skrypt wykonywał się jak normalny program, bez użycia polecenia gnuplot. W takim wypadku trzeba na początku skryptu dodać informację o używanym interpreterze poleceń, podobnie jak w przypadku każdego innego skryptu. Początek tak przygotowanego skryptu prezentuje listing 2.

Listing 2

#!/usr/bin/gnuplot
set xrange [-2*pi:2*pi]
set yrange [-3:3]
...

Wyjście graficzne

Do tej pory wszystkie generowane wykresy eksportowane były do graficznego okienka, które można nazwać podglądem, a które można było przy pomocy podręcznego menu zapisać w kilku podstawowych formatach graficznych. Nie wyczerpuje to wszystkich, a wręcz stanowi ułamek, możliwości gnuplota. Przy pomocy polecenia set terminal można przekierować wyjście do pliku graficznego. Dostępne opcje w danej instalacji można uzyskać, wpisując w trybie interaktywnym:

gnuplot> set terminal

Zatem wpisanie:

gnuplot> set terminal png

spowoduje generowanie wykresów do plików png. Każdy format wyjściowy ma mnóstwo parametrów określających schemat kolorów czy używane czcionki. Nie wpisując nic, decydujemy się na opcje domyślne, o czym zostaniemy poinformowani odpowiednim komunikatem, na przykład:

Options are ‘nocrop enhanced size 640,480 font „/usr/share/fonts/dejavu/DejaVuSans.ttf,12.0” ‘

Potrzeba jeszcze ustalić nazwę pliku wyjściowego:

gnuplot> set output ‘wykres.png’

Od tej pory każde wywołanie plot spowoduje, zamiast wyświetlenia okna, wygenerowanie pliku z wykresem.

Wszystkie wykresy w tym skrypcie, wygenerowane przez gnuplot, są formatu eps (Encapsulated PostScript) i powstały po wywołaniu:

gnuplot> set terminal postscript eps enhanced color font ‘Helvetica,20’
gnuplot> set output ‘wykres.eps’

Dane z pliku

W rozdziale Rejestrator danych do prezentacji danych pochodzących z rejestratora użyliśmy arkusza kalkulacyjnego. Otrzymanie wykresu wymagało wykonania wielu kroków, a używanie przecinka zamiast przyjętej ogólnie kropki dziesiętnej wywołało dodatkowe komplikacje. O dziwo, a może przy tym stanie wiedzy już nie, przy użyciu gnuplota można to zrobić w jednym kroku, a przy ustaleniu terminala w trzech. Pamiętajmy jednak, że możemy mieć przygotowany skrypt z preferowanymi ustawieniami.

Wprost z linii poleceń możemy napisać:

gnuplot -p -e ‘plot „DATA.TXT”’

pamiętając oczywiście, że plik musi znajdować się w odpowiedniej lokalizacji, w przeciwnym wypadku będzie konieczne podanie ścieżki dostępu. Wykorzystaliśmy dwie opcje: -p zapobiegającą znikaniu wykresu oraz -e powodującą wykonanie polecenia gnuplota. Bez tej drugiej opcji gnuplot oczekiwałby na podanie nazwy pliku zawierającego skrypt. Wykres ten, rzecz jasna, nie zawiera żadnego formatowania, poza domyślnym, ale tym zajmiemy się w następnym punkcie przy okazji omawiania bardzo ważnego w metrologii zagadnienia aproksymacji zależności teoretycznej do danych doświadczalnych.

Dopasowanie zależności teoretycznej

Znajomość, aczkolwiek nie zawsze dogłębna, pakietów biurowych i ich popularność powoduje, że zamiast dopasowywać narzędzia do konkretnego problemu, próbujemy do wszystkich problemów stosować „uniwersalne” oprogramowanie z Office w nazwie. Arkusze kalkulacyjne posiadają możliwość aproksymacji (dopasowania) zależności teoretycznej do danych pochodzących z eksperymentu. Jednakże lista funkcji jest zamknięta.

Prezentowany w rozdziale Rejestrator danych problem stygnięcia ciał nie daje się aproksymować (w prosty sposób) przy pomocy arkuszy kalkulacyjnych MS Excel i LO Calc. W ustalonych warunkach spadek temperatury wody w czasie można opisać zależnością:

(1)

Gnuplot daje możliwość aproksymowania dowolną zdefiniowaną przez użytkownika funkcją przy użyciu metody najmniejszych kwadratów. Do tego celu służy polecenie fit.

Dla lepszego zobrazowania tworzenia tego typu zależności zredukowano poprzez losowe usunięcie z pliku DATA.TXT większości punktów pomiarowych, zostawiając 20 oraz wprowadzając niepewności pomiaru temperatury w trzeciej kolumnie danych. Skrypt prezentujący te dane przedstawiono na listingu 3.

Listing 3

set terminal postscript eps enhanced color font 'Helvetica,20'
set output 'wykres.eps'
set xlabel "t, s"
set ylabel "T, {/Symbol \260}C"
A = 60
B = 20
C = 0.0005
f(x) = A*exp(-C*x)+B
fit f(x) "data.txt" using 1:2 via A,B,C
plot "data.txt" using 1:2:3 with yerrorbars title "eksperyment", f(x) title "teoria"

W wierszu 8 definiujemy własną funkcję parametryzowaną trzema zmiennymi A, B i C. Przy pomocy tej funkcji wykonujemy poszukiwanie optymalnych wartości tych zmiennych poleceniem fit. Opcja using pomaga zdefiniować, która kolumna jest argumentami, a która wartościami funkcji, via wskazuje które zmienne mają podlegać optymalizacji. Ustalenie warunków początkowych w wierszach 5, 6 i 7 można pominąć – zostaną przyjęte wartości domyślne równe jeden, ale nie jest to dobre działanie, szczególnie w przypadku funkcji nieliniowych. Należy, jeśli to możliwe, rozpoczynać optymalizację od parametrów najbardziej zbliżonych poszukiwanym. Zawsze są przesłanki do tego, żeby je przewidzieć, bo wszystkie optymalizowane parametry mają swoją fizyczną interpretację. Wyniki optymalizacji, oprócz tego, że wyświetlają się w terminalu, to dodatkowo zapisywane są w pliku fit.log. Najważniejsze są wiersze wyniku poszukiwania, bo można w nich odnaleźć wartości dopasowywanych parametrów oraz ich odchylenia standardowe, będące bezpośrednio miarą ich niepewności typu A.

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
A               = 43.7588          +/- 0.3897       (0.8906%)
B               = 39.8232          +/- 0.4213       (1.058%)
C               = 0.000920299      +/- 1.62e-05     (1.761%)
Rysunek 5. Dopasowanie zależności teoretycznej (1) do danych rejestratora z rozdziału Rejestrator danych

Opcja using występująca także po poleceniu plot jest bardzo przydatna do obsługi plików zawierających wiele serii danych. W tym przypadku kolumna 3 wskazuje na niepewności pomiarów temperatury. Opcja title zastępuje domyślne etykiety w legendzie. Widać, że plot może jednocześnie wyświetlać zależności opisane wzorami, jak i dane z plików. Wynik uruchomienia skryptu z listingu 3 prezentuje wykres 5. Otrzymanie znaku stopnia wymagało odwołania się do kodu tego znaku {/Symbol \260}.

Gnuplot w C++

Często zachodzi potrzeba wizualizacji danych otrzymanych na podstawie obliczeń wykonanych przy pomocy programów napisanych w językach C lub C++. Zastosowanie arkuszy kalkulacyjnych do podobnego celu zostało zaprezentowane w rozdziale Rejestrator danych. Teraz można zrozumieć o ile łatwiej do tego używać programu gnuplot, tym bardziej, że jego uruchomienie można wykonać już na poziomie kodu źródłowego C/C++ (listing 4).

Listing 4

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
    double t, x, y;
    ofstream plik("dane.txt");
    for(t = -2; t <= 2; t += 0.1) {
        x = 1 + 3*t*t;
        y = t*(t*t - 2);
        plik << x << "  " << y << endl;
    }
    plik.close();
    
    ofstream plik2("wykres.gp");
    plik2 << "set terminal postscript eps enhanced color font 'Helvetica,20'" << endl;
    plik2 << "set output 'wykres.eps'" << endl;
    plik2 << "plot 'dane.txt' with lines" << endl;
    
    plik2.close();
    
    system("gnuplot 'wykres.gp'");
    
    return 0;
}
Rysunek 6. Wykres wprost z programu w C++

Program 4 generuje dwa pliki: dane.txt z danymi oraz wykres.gp ze skryptem gnuplota, który jest następnie wywoływany poleceniem system. Wynik w postaci parametrycznej funkcji przedstawiony jest na rysunku 6.

Modyfikacje

Nie sposób opisać nawet ułamka możliwości gnuplota w tak krótkim opracowaniu, ale jest ono wystarczające do rozpoczęcia pracy. Oficjalna dokumentacja www.gnuplot.info/docs_5.2/Gnuplot_5.2.pdf ma ponad 250 stron, a nie jest podręcznikiem tylko suchą instrukcją. Jednak rozbudowany system różnorakiej dokumentacji internetowej, przede wszystkim w postaci przykładów, pozwoli uzyskać zamierzony ostateczny wygląd wykresów. Wiele stron oferuje różnego typu tutoriale, ale na szczególną uwagę zasługuje, oprócz oficjalnej strony www.gnuplot.info, także www.gnuplotting.org. Spróbuj na przykład, a jest to możliwe, podpisać podziałkę główną osi x wielokrotnością liczby π.

Korzystając z polecenia fit można teraz wyznaczyć tempo stygnięcia dla różnych cieczy i dokończyć wyznaczanie względnego ciepła właściwego opisanego w modyfikacjach rozdziału Rejestrator danych.

Literatura

Powtórzenie zaprezentowanych projektów nie wymaga studiowania dodatkowej literatury. Dopiero wprowadzenie modyfikacji może wiązać się z koniecznością uzupełnienia wiedzy. Najlepszym źródłem informacji w przypadku jakiegoś konkretnego problemu jest internet. Książka pisana swoją wyższość ukazuje dopiero jako podręcznik czy przewodnik.

Informacje bibliograficzne dotyczące źródeł internetowych zamieściłem bezpośrednio w tekście, przy zagadnieniach, których dotyczą.

Do zapisu linków, tylko w tym spisie, wykorzystywana jest metoda skracania adresów (URL shortening). W tym skrypcie wybrano serwis TinyURL. Dostęp do wszystkich internetowych zasobów został przetestowany 27.02.2020.

Bibliografia zawiera tylko materiały pomocnicze do projektów, których dotyczą, a pominięto literaturę o charakterze ogólnoinformatycznym. Dobór materiałów do nauki kodowania, czy obsługi programów narzędziowych, pozostaje po stronie nauczyciela.

Ze znalezieniem informacji na temat programu gnuplot także nie powinno być problemu. Oficjalne wsparcie znajdziemy na stronach:

Jest to dosyć „sucha” dokumentacja. Szczęśliwie internet jest pełen samouczków i poradników na ten temat, także w języku polskim.

Literatura uzupełniająca

W niektórych projektach nie wszystko da się podłączyć za pomocą pasujących do siebie wtyków i złącz. Należy wówczas wykonać takie podłączenia samodzielnie. Wymaga to nieco umiejętności majsterkowania i elektroniki. Bardzo ciekawą książką dla początkujących majsterkowiczów jest:

  • Roberts Dustyn, Wpraw to w ruch. Proste mechanizmy dla wynalazców, majsterkowiczów i artystów [e-book], tłum. Krzysztof Sawka, Helion, 2015.

Znajdziemy w niej oprócz podstaw elektroniki także dużo elementarnej mechaniki i materiałoznawstwa.

Majsterkowanie z użyciem systemów wbudowanych, tam gdzie nie wszystko pasuje do siebie za pomocą dedykowanych styków, wymaga elementarnej wiedzy z elektroniki. Niezmiennie najważniejszą książką na półce elektronika jest:

  • Horowitz Paul, Hill Winfield, Sztuka elektroniki, tłum. Bogusław Kalinowski, Grażyna Kalinowska, t. 1–2, wyd. 12 zmienione, WKŁ, Warszawa 2018.

Jednakże jest to pozycja dla wymagającego czytelnika. Podobnym standardem, ale skierowanym do początkujących jest:

  • Platt Charles, Elektronika. Od praktyki do teorii. Wydanie II [e-book], tłum. Konrad Matuk, Helion, 2016.

Na uwagę zasługuje ponadto, w moim przekonaniu bardzo dobra, książka polskiego autora:

  • Górecki Piotr, Wyprawy w świat elektroniki, t. 1, WKŁ, Warszawa 2006.
  • Górecki Piotr, Wyprawy w świat elektroniki. Wyższy stopień wtajemniczenia, t. 2, WKŁ, Warszawa 2011.

1 Nazwa „gnuplot” nie ma nic wspólnego z projektem GNU, a zbieżność nazw jest przypadkowa, dlatego nie należy pisać GNUPlot, ani GNUplot.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *