2014-06-13

Tworzenie wykresów naukowych w LaTeX-u za pomocą pgfplots, cz. 1

Jak wiadomo LaTeX potrafi wiele rzeczy związanych ze składem tekstu. Pakiet pgf/tikz umożliwia łatwe i eleganckie tworzenie różnorakich diagramów, rysunków i wykresów w kodzie LaTeXa. Powstał nawet pakiet pgfplots, będący rozszerzeniem pgf/tikz specjalnie poświęconym generowaniu wykresów. I ten właśnie pakiet chciałbym omówić.

Oczywiście chociaż pobieżne omówienie podstawowych funkcji pakietu pgfplots przerasta możliwości tego posta (a raczej serii postów, gdyż, jak można wywnioskować z tytułu, planuję ich więcej niż jeden) - w końcu oficjalny manual liczy sobie ponad 300 stron. Dlatego też postanowiłem stworzyć kilka przykładowych, "życiowych", wykresów i omówić pokrótce ich kod, tak aby każdy mógł dostosować go do swoich potrzeb.

Na pierwszy ogień idzie chemia :-)

Oto wykres (użyłem danych z Wikipedii)...


...a oto kod:


\begin{tikzpicture}[scale=1.5]
\begin{axis}[
title={Zależność rozpuszczalności NaCl oraz CuSO$_4\cdot$5H$_2$O od temperatury},
title style={text width=16em},
xlabel={Temperatura [\textcelsius]},
ylabel={Rozpuszczalność [g/100~g wody]},
xmin=0,xmax=100,
ymin=0,ymax=120,
legend pos=north west,
ymajorgrids=true,grid style=dashed
]

\addplot[color=red,mark=*]
coordinates {
(0,35.65)
(10,35.72)
(20,35.89)
(30,36.09)
(40,36.37)
(50,36.69)
(60,37.04)
(70,37.46)
(80,37.93)
(90,38.47)
(100,38.99)
};

\addplot[color=blue,mark=square]
coordinates {
(0,23.1)
(10,27.5)
(20,32)
(30,37.8)
(40,44.6)
(60,61.8)
(80,83.8)
(100,114)
};

\legend{NaCl,CuSO$_4\cdot$5H$_2$O}
\end{axis}
\end{tikzpicture}




Na początku należy oczywiście włączyć pakiet pgfplots dodając następującą linię w preambule dokumentu:
\usepackage{pgfplots}

Jak można zauważyć, cały kod wykresu znajduje się w środowisku axis, które z kolei znajduje się wewnątrz środowiska tikzpicture. Parametr scale umożliwia szybkie przeskalowanie wykresu, dzięki czemu nie musimy go specjalnie poprawiać przenosząc np. z artykułu na prezentację lub plakat.
Środowisko axis generuje nam wykres w dwuwymiarowej przestrzeni kartezjańskiej z osiami "po Bożemu" (istnieją jeszcze środowiska semilogxaxis, semilogyaxis, loglogaxis).

Wewnątrz środowiska axis należy podać przede wszystkim informacje co na wykresie ma być. Innymi słowy - należy zdefiniować serie danych: co ma być dziedziną (punkty X) a co przeciwdziedziną (punkty Y). Do dodania nowej serii danych (funkcji) na wykresie służy polecenie \addplot. Dane możemy albo pobrać z pliku (co pokażę w późniejszych odcinkach serii) albo wpisać je ręcznie, jeśli mamy ich niewiele, w następujący sposób:

\addplot[parametr1,parametr2,...]
coordinates {
(x1,y1)
(x2,y2)
...i tak dalej...
};

W powyższym przykładzie użyłem dwóch parametrów polecenia \addplot: zdefiniowałem kolor (color=) oraz symbol markera (mark=). Jak można zauważyć gwiazdka * w kodzie daje w wyniku koło, zaś square - kwadrat bez wypełnienia. Przy okazji dopowiem, że mark=o daje w wyniku okrąg, zaś wypełniony kwadrat uzyskuje się za pomocą mark=square* (po resztę markerów odsyłam do manuala).

Dobra, umiemy już dodawać dane, czas na inne elementy wykresu. Użyte przeze mnie w powyższym przykładzie parametry środowiska axis to:
  • title - tytuł wykresu;
  • xlabel, ylabel - etykiety osi X i osi Y;
  • xmin, xmax - zakres dla osi X;
  • ymin, ymax - zakres dla osi Y;
  • title style={text width=16em} - ponieważ tytuł wykresu jest dość długi, dobrym pomysłem jest ograniczyć szerokość tekstu dla tytułu;
  • legend pos=north west - legenda wykresu będzie znajdować się w lewym górnym rogu, tak aby nie przysłaniała punktów;
  • ymajorgrids=true - dodajemy linie siatki, będące przedłużeniem wartości na osi Y;
  • grid style=dashed - linie siatki będą kreślone linią przerywaną.

Na koniec wspomnę jeszcze o poleceniu \legend{wpis1,wpis2,...} które określa zawartość legendy, gdzie wpis1 jest opisem pierwszej serii danych (zdefiniowanej w pierwszym użytym poleceniu \addplot), wpis2 - opisem drugiej serii danych, itd.

I to już koniec na dzisiaj. Życzę miłej zabawy z pakietem pgfplots i zapraszam na następne odcinki serii.