2017-09-25

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

Część trzecia miała bardzo, bardzo duże opóźnienie, ale w końcu się ukazała.

Tym razem chciałbym pokazać dwa typy wykresów które mogą zainteresować ekonomistów.

Przykład pierwszy:

Kod:

\begin{tikzpicture}[scale=1.5]
\begin{axis}[
title={Indeks WIG},
xmin=1991-04-16,xmax=2017-09-22,
date coordinates in=x,
xticklabel= \year-\month,
xtick={1991-05-01,1993-01-01,1995-01-01,1997-01-01,1999-01-01,2001-01-01,2003-01-01,2005-01-01,2007-01-01,2009-01-01,2011-01-01,2013-01-01,2015-01-01,2017-09-22},
xticklabel style={rotate=90},
ymin=0,ymax=7.0e4,
yticklabel style={/pgf/number format/1000 sep={}},
scaled ticks=false,
ymajorgrids=true,grid style={help lines, color=gray!30!white, thin}
]
\addplot[color=blue,mark=none]
table[x=Date,y=Open,col sep=comma] {wig.csv};
\end{axis}
\end{tikzpicture}


Jak można zauważyć, na osi X mamy daty, nie proste liczby. Dlatego też, aby stworzyć ten typ wykresu potrzebujemy dodać \usepgfplotslibrary{dateplot} (odpowiednia biblioteka pgfplots) w preambule. Plik wig.csv na kilka kolumn, z czego pierwsza (zwana Date) zawiera datę w formacie ISO 8601, natomiast inne zawierają zwykłe liczby. Dalej, polecenie date coordinates in=x określa, że pgfplots ma traktować serię X jako datę. Nowych elementów jest więcej:
  • xticklabel= \year-\month — etykiety osi X będą przedstawiane w postaci numerycznej rok-miesiąc
  • xtick={1991-05-01,…} — określenie które podziałki na osi X (oraz etykiety) będą pokazywane
  • xticklabel style={rotate=90}, — przekręcenie etykiet osi X o kąt 90°
  • yticklabel style={/pgf/number format/1000 sep={}} — format liczb na osi Y (liczby bez separatora tysięcznego i bez żadnych cyfr po przecinku)
  • scaled ticks=false — zabrania automatycznego przedstawiania dużych liczb w notacji naukowej (czyli, np. będziemy mieli 20000 a nie 2·104)

Następny przykład jest wykresem kolumnowym, gdzie seria X jest nie liczbami lecz tekstem:
Kod:

\begin{tikzpicture}[scale=1.5]
\begin{axis}[width=25em,height=15em,
ybar,
ylabel = {Stopa bezrobocia [\%]},
title style={align=center,font=\small},
title={Stopa bezrobocia w wybranych krajach europejskich\\w drugim kwartale 2017\\(źródło: Eurostat)},
axis x line*=bottom,axis y line*=left,
symbolic x coords={Niemcy,Wielka Brytania,Holandia,Polska,Irlandia,Francja,Hiszpania,Grecja},
xtick={Niemcy,Wielka Brytania,Holandia,Polska,Irlandia,Francja,Hiszpania,Grecja},
ymin=0,ymax=30,
y axis line style={opacity=0},
y tick style={color=gray!30!white, thin},
nodes near coords,
every node near coord/.append style={/pgf/number format/.cd,fixed,fixed zerofill,precision=1,use comma},
x tick label style={rotate=45,anchor=east},
ymajorgrids=true,grid style={help lines, color=gray!30!white, thin}
]
\addplot
coordinates {
(Niemcy, 3.8)
(Holandia, 5.0)
(Wielka Brytania, 4.4)
(Polska, 5.1)
(Francja, 9.6)
(Irlandia, 6.4)
(Hiszpania, 17.3)
(Grecja, 21.5)
};
\end{axis}
\end{tikzpicture}


W tym przypadku dziedziną (serią X) są nazwy państw (Niemcy, Holandia, itd.), zaś przeciwdziedziną (seria Y) — przyporządkowane im liczby. Najważniejszymi poleceniami wewnątrz środowiska axis są:
  • ybar, które określa że wykres będzie wykresem kolumnowym;
  • symbolic x coords={Niemcy,Wielka Brytania,Holandia,…} — ponieważ seria X jest tekstem, pgfplots nie potrafi automatycznie określić uporządkowania dziedziny; należy mu więc określić które elementy dziedziny mają trafić do wykresu oraz w jakiej kolejności (warto zauważyć, że o ile w definicji serii X Holandia jest przed Wielką Brytanią, to przez symbolic x coords określamy, że na wykresie Wielka Brytania będzie przed Holandią).

Inne linie warte wzmianki to:
  • y axis line style={opacity=0} — oś Y będzie miała przezroczystość ustawioną na 0, a więc zniknie; podziałka na osi X oraz etykiety nadal będą widoczne
  • y tick style={color=gray!30!white, thin} — styl podziałek na osi Y (aby pasowały do stylu linii siatki)
  • nodes near coords — wartości Y dla danego X pojawią się powyżej kolumny (jeśli zastosujemy to polecenie dla wykresu z markerami, to liczby będą pokazywane nad markerem)
  • every node near coord/.append style={/pgf/number format/.cd,fixed,fixed zerofill,precision=1,use comma} — formatowanie powyższych liczb: jedna cyfra po przecinku oraz użycie przecinka jako separatora dziesiętnego
  • x tick label style={rotate=45,anchor=east} — etykiety osi X są przekręcone oraz umocowane tak, jakby były zawieszone na podziałce osi X swoją prawą stroną (stąd anchor=east, analogicznie można użyć west, north, south).