Octave – Wykresy

Rysunki dwuwymiarowe

Aby narysować wykres funkcji jednej zmiennej lub zbioru danych w formacie (xi, yi), należy przygotować wektor “iksów” i wektor “igreków”, a następnie użyć polecenia plot:

x = -4:0.1:4;  # iksy
y = (x.^3 + 2*x.^2 + 3*x + 4)./(x.*x+1);  # igreki
plot(x,y);  # bardzo prosty wykres

Powyższy przykład generuje prosty wykres funkcji wymiernej f(x) = \frac{x^3 + 2x^2 + 3x + 4}{x^2+1}

octave-fun1

Wykres ten jest bardzo prymitywny, spróbujmy więc go nieco urozmaicić.

x = linspace(-4,4,50);
y = (x.^3 + 2*x.^2 + 3*x + 4)./(x.*x+1);
plot(x, y, "ro-;pewna funkcja wymierna;");

octave-fun2

Zmianie uległa definicja wektora x: funkcja linspace (a,b, N) generuje ciąg N równoodległych punktów (ciąg arytmetyczny), z których pierwszy równy jest a, a ostatni – b. Zaletą tego podejścia jest to, że od razu widać, z ilu elementów składa się x. Druga zmiana zaszła w wywołaniu funkcji plot: doszedł trzeci argument, napis "ro-;pewna funkcja wymierna;".  Ten trzeci argument definiuje format wykresu i składa się z liter i symboli umieszczonych w napisie w dowolnej kolejności, lecz mających specyficzne znaczenie:

  • Styl linii:
    • -    Linia ciągła (opcja domyślna)
    • --   Linia przerywana
    • :     Linia kropkowana
    • -.  Linia przerywana z kropkami
  • Styl symbolu reprezentującego punkt danych:
    • +   plusik
    • o   kółko
    • *   gwiazdka
    • .   punkt
    • x   krzyżyk
    • s   kwadrat
    • d   romb (ang. diamond)
    • ^   trójkąt z ostrzem w górę
    • v   trójkąt w dól
    • >   trójkąt z ostrzem w prawo
    • <   trójkąt z ostrzem w lewo
    • p   pięciokąt
    • h   sześciokąt (ang. hexagram)
  • Kolor linii i/lub symbolu:
    • k   czarny (ang. blacK)
    • r   czerwony
    • g   zielony
    • b   niebieski
    • m   magenta
    • c   cyan
    • w   biały
  • Opis wykresu (legenda)
    • ;legenda;

Poniższy kod ilustruje, w jaki sposób można narysować wykresy kilku funkcji naraz:

x = linspace(-4,4,50);
y = (x.^3 + 2*x.^2 + 3*x + 4)./(x.*x+1);
y2 = x + 2;
plot(x, y, "ro-;pewna funkcja wymierna;", x, y2, "k--;asymptota g(x) = x + 2;");

octave-fun3

Dodajmy jeszcze kilka wodotrysków, jak podpisy osi, tytuł całego rysunku (niestety, bez polskich liter), siatkę, ograniczenie zakresu osi “y” do [-3:8] i zapiszmy wykres na dysku w formacie eps i png:

x = linspace(-4,4,100);
y = (x.^3 + 2*x.^2 + 3*x + 4)./(x.*x+1);
y2 = x + 2;
plot(x, y, "r-;pewna funkcja wymierna;", x, y2, "k--;asymptota g(x) = x + 2;");
xlabel("x");
ylabel("y");
title("Wykres pewnej funkcji wymiernej i jej asymptoty ukosnej");
ylim([-3,8]);
grid on;
print "rys.eps"
print "rys.png"

Dość niezwykłe w powyższym kodzie jest to, że instrukcje modyfikujące wygląd wykresu, np. ylabel, pojawiają się dopiero po komendzie generującej sam wykres (plot). Wiąże się to z tym, że Octave potrafi obsługiwać kilka okienek naraz.

Oto wynik działania powyższego skryptu:

rys
Ostateczny wykres w formacie PNG (kliknij, aby powiększyć).

Jak widać, Octave nie posiada bardzo wygodnego interfejsu do tworzenia pięknych wykresów, jednak świetnie nadaje się do szybkiego tworzenia wykresów w miarę czytelnych. Możliwości programu są w tym zakresie naprawdę duże, a funkcje plot i print to tylko niewielka część jej repertuaru.

Alternatywy

Rysunki to nie tylko wykresy, ale także schematy, obrazy rastrowe, mapy konturowe itp. Do szybkiego tworzenia szkiców wykresów dobrze nadają się się m.in.:

  • Wolfram Alpha – do szybkiego tworzenia prostych wykresów.
  • Excel/Libre Office – arkusze kalkulacyjne są użyteczne do analizy danych, umożliwiają szybkie tworzenie wyjątkowo nieestetycznych wykresów.
  • Język Python – do szybkiego tworzenia wykresów i złożonej analizy danych.

Profesjonalne rysunki można wygenerować m.in. następującymi programami:

  • Gnuplot– złoty standard naukowców z obszaru STEM w zakresie wykresów naukowych oraz średnio zaawansowanej analizy danych.
  • Grace – program dla platformy linuksowej do tworzenia wykresów oraz wstępnej analizy danych; bardziej “okienkowy” od gnuplota, a więc i bardziej “ciężki”, ale chyba mniej elastyczny, na pewno mniej popularny.
  • MS Word, Power Point – doskonale nadają się do tworzenia schematów blokowych.
  • Inkscape – świetny program do grafiki wektorowej, doskonały do tworzenia bardziej złożonych schematów, diagramów etc.
  • Gimp – uniwersalny program do obróbki obrazów rastrowych, niezły odpowiednik komercyjnego Photoshopa. Większość obrazków w tym serwisie pochodzi z Gimpa.
  • Paraview – bardzo popularny program do analizy i wizualizacji danych inżynierskich, zwłaszcza rozwiązań równań różniczkowych cząstkowych w 2 i 3 wymiarach.
  • Mathematica Wolfram – do tworzenia zaawansowanych wykresów z wieloma opcjami.
  • C++, Python, FORTRAN lub jakikolwiek inny język programowania – ten wariant umożliwia własnoręczną wizualizację danych w postaci map rastrowych lub grafiki wektorowej. Trzeba tylko nauczyć się (podstaw) jakiegoś standardu kodowania grafiki, np. PostScriptu do grafiki wektorowej lub PPM do grafiki rastrowej.
  • TikZ – https://en.wikipedia.org/wiki/PGF/TikZ

Zadania

  1. Napisz w Octave plik generujący wykres funkcji f(x) = \sqrt{1-x^2} dla -1 ≤ x ≤1 wraz ze stosownymi wodotryskami (tytułem, podpisanymi osiami).
  2. Na podstawie poprzedniego punktu narysuj okrąg sklejając dwie funkcje. Wyświetlone “spłaszczone koło” nie jest satysfakcjonujące. Napraw skalowanie osi przy pomocy instrukcji pomocniczej
    axis ("square");
  3. Zmieniając jedynie zakresy argumentów i wartości funkcji wygeneruj wykres przedstawiający tylko prawo-górną ćwiartkę okręgu.
  4. Mając okrąg z zadania drugiego wygeneruj obrazek w formacie *.png z okręgiem.
  5. Nowe zadanie: kod poniżej generuje wykres okręgu o promieniu 1:
    N = 60;
    f = @(x) sqrt(1 - x.* x);
    x  = linspace(-1, 1, N);
    x0 = linspace(1, -1, N);
    y = [f(x), -f(x0)];
    x = [x, x0];
    plot (x, y, "+-");
    axis("equal");

    Kod ten ma pewną wadę: punkty nie układają się równomiernie na okręgu, co prowadzi do zniekształcenia kształtu okręgu w okolicach osi x, (rysunek po lewej):
     

    Zaproponuj inny sposób narysowania okręgu, który będzie gwarantował równomierny rozkład punktów, jak na rysunku po prawej. Jako zmiennej niezależnej możesz użyć kąta \varphi oraz podstawień x = \cos(\varphi) i y=\sin(\varphi) . Uwaga: zwróć uwagę na to, że w powyższy sposób można w Octave rysować szersze klasy obiektów niż wykresy funkcji. Wskazówka: polar plot + octave.