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).

2016-06-26

Beamer, tło i (pół)przeźroczystość

Swego czasu (jakieś dwa lata temu) bawiłem się tłami i półprzeźroczystością w prezentacjach beamera. Publikuję, bo może komuś się przyda.


TeX-a i PDF-a można pobrać stąd

2016-05-24

LaTeX -> EPS, PNG, SVG

Czasami zachodzi potrzeba wyeksportowania pewnych elementów stworzonych w LaTeX-u (np. formuł matematycznych lub grafik wykonanych za pomocą pakietu tikz) do formatów graficznych takich jak EPS, PNG, SVG. Po co? Najczęściej po to, aby umieścić je na stronie WWW (chociaż do umieszczania formuł matematycznych na stroniach WWW polecam MathJAX) lub zaimportować do innego programu. Poniżej zamieszczam opis sposobu jak wychodząc z jednego pliku TeX otrzymać wiele plików EPS, PNG, SVG.

Krok 1 – przygotowanie pliku LaTeX-owego – nazwijmy go roboczo plik.tex. Ważnym jest aby każdy element, który ma w wyniku dać plik graficzny, znajdował się na oddzielnej stroni PDF-a powstałego po kompilacji. Jeśli w pliku TeX znajdują się tylko elementy do przetworzenia, możemy w kodzie oddzielić je po prostu za pomocą \newpage; na przykład:

\documentclass[12pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}

\pagestyle{empty}

\begin{document}

$$a^2 = b^2 + c^2$$

\newpage

$$E = m c^2$$

\newpage

\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

Możemy też użyć pakietu preview, który, gdy aktywny (parametr active), z wyjsciowego PDF-a wycina nam wszystko z wyjątkiem zdefiniowanych środowisk – w poniższym przykładzie są to eksponowane środowiska matematyczne (czyli $$…$$, displaymath, equation; użyty parametr displaymath) oraz środowisko tikzpicture (użyte polecenie \PreviewEnvironment{tikzpicture}).

\documentclass[12pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage[active,displaymath]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}

To jest ważny wzór
$$a^2 = b^2 + c^2$$
Ten wzór też jest ważny
$$E = m c^2$$
ale ten $x^2=1$ już nie.

A to taki tam obrazek

\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

Plik plik.tex kompilujemy do pliku plik.pdf, który będzie bazą dla następnych operacji.

Krok 2 – skrypt bash – nazwijmy go roboczo skrypt.sh.

#!/bin/bash

pdfcrop $1
mv `basename $1 .pdf`-crop.pdf $1
pdftk $1 burst
rm doc_data.txt

for i in pg_*.pdf
do
j=`basename $i .pdf`
pdftops -eps $i $j.eps
convert -density 150 -background transparent $i $j.png
pdf2svg $i $j.svg
rm $i
done

Skrypt uruchamiamy podając jako parametr nazwę utworzonego wcześniej pliku PDF:

./skrypt.sh plik.pdf

Co robi powyższy skrypt? Objaśnienie linia po linii:
  • pdfcrop $1 — przycina ładnie każdą stronę pliku plik.pdf (aby usunąć nadmiarowe marginesy wokół np. równań) i zapisuje wynik do pliku plik-crop.pdf
  • mv `basename $1 .pdf`-crop.pdf $1 — zmienia nazwę pliku plik-crop.pdf na plik.pdf
  • pdftk $1 burst — dzieli plik plik.pdf na pliki zawierające po jednej stronie; powstają wtedy pliki pg_0001.pdf, pg_0002.pdf, itd.
  • rm doc_data.txt — ponieważ pdftk tworzy nam niepotrzebny plik doc_data.txt — usuwamy go
  • for i in pg_*.pdf — tu mamy początek pętli po wszystkich plikach pg_0001.pdf, pg_0002.pdf, itd.
  • j=`basename $i .pdf` — wyodrębniamy rdzeń nazwy bez rozszerzenia, który będzie potrzebny przy nazywaniu następnych plików
  • pdftops -eps $i $j.eps — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.eps, pg_0002.eps, itd. (uwaga! zamiast pdftops można też użyć ghostscripta jak kto woli)
  • convert -density 150 -background transparent $i $j.png — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.png, pg_0002.png, itd. (parametry konwersji: przezroczyste tło i dpi=150)
  • pdf2svg $i $j.svg — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.svg, pg_0002.svg, itd.
  • rm $i — usuwamy niepotrzebne już teraz pliki pg_0001.pdf, pg_0002.pdf, itd.

That's all folks!

2015-03-08

Programy DTP - oś czasu

Oto oś czasu prezentująca rozwój najpopularniejszych programów DTP. Uwagi są mile widziane.

(jak zwykle – kliknij na grafice aby powiększyć ją do zadowalających/czytelniejszych rozmiarów)

2014-12-14

Polska klawiatura programisty w Linuksie - nie tylko alfabet

Najczęściej używanym przez polskiego użytkownika Linuksa układem klawiatury jest tzw. polska klawiatura programisty. Wszyscy wiedzą, że aby uzyskać wielką literę albo wykrzyknik należy użyć klawisza Shift, zaś aby uzyskać litery z polskimi znakami diakrytycznymi – należy użyć prawego klawisza Alt. Nie wszyscy jednak wiedzą, ze z tego układu klawiatury można wycisnąć nieco więcej. Na poniższym rysunku (kliknij aby go powiększyć) przedstawiłem znaki które można otrzymać przyciskając dany klawisz oraz:
  • żadnego modyfikatora (lewy górny róg „kratki”)
  • klawisz Shift (prawy górny róg)
  • prawy klawisz Alt (lewy dolny róg)
  • jednocześnie klawisze Shift i Alt (prawy dolny róg)


Dzięki znajomości odpowiednich skrótów można w dość prosty sposób umieścić w tekście np. zarówno poprawny polski cudzysłów („Ala ma kota”), jak i jego niemiecką („Ala hat eine Katze“) czy francuską (« Ala a un chat ») wersję.

2014-10-23

Compression of plain text files - 7z vs zip vs rar

This blog post is a translation of original post in Polish – for my friends who do not speak Polish :-)

Quantum-mechanical calculation codes create output in the form of plain text files. Sometimes the files are very large - a several / a few dozen MB of plain text. Some time ago I decided to clean out some directories containing calculation outputs in large text files (to save some disk space) and compress them. By the way I checked which one of the three common compression formats – zip, rar, or 7z – has better compression level for text files.

Size without compression (MB)Zip archive (MB)7z archive (MB)Rar archive (MB)
Directory 1 (only text files)193,738,82,43,5
Directory 2 (only text files)633,7128,65,98,5
Directory 3 (text and binary files)699,6153,399,7144,4

The results are very interesting, because for plain text files (of high redundancy) the 7z compression allows you to create an archive of size up to 100 times smaller than uncompressed files (and up to several times smaller than a zip/rar archive).

2014-07-23

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

Trochę długo zbierałem się do napisania drugiego odcinka serii, ale w końcu powstał ;-)

Tym razem mam do pokazania dwa przykłady wykresów stworzonych za pomocą pgfplots. Na ich przykładzie chciałbym pokazać, jak za pomocą pgfplots wczytywać serie danych z pliku.

Przykład pierwszy:

2014-06-23

Wyrażenia matematyczne na stronach WWW - MathJAX


Biblioteka javascriptowa MathJAX umożliwia w łatwy sposób zamieszczanie wyrażeń matematycznych na stronach WWW, używając składni LaTeX-owej (możliwe jest także używanie składni MathML oraz ASCIIMathML, ale zostańmy przy LaTeX-u). MathJAX powstał w 2009 roku i jest rozwijany pod egidą Amerykańskiego Towarzystwa Matematycznego (American Mathematical Society, AMS - to ci od pakietu amsmath). Obecnie jest używany na wielu stronach WWW, m.in. na Wikipedii, arXiv, czy stronie Physical Review.

MathJAX ma tą przewagę nad standardem MathML że:
  • działa na większej ilości przeglądarek,
  • posługuje się prostą składnią LaTeX-ową a nie lasem znaczników jak MathML - przykład: odpowiednikiem LaTeX-owego $E=mc^2$ w MathML jest <math><mi>E</mi><mo>=</mo><mi>m</mi><msup><mi>c</mi><mn>2</mn></msup></math> (skonwertowane za pomocą edytora WIRIS)

Aby zacząć zabawę/pracę z MathJAX należy wpierw umieścić w kodzie HTML odnośnik do biblioteki:

<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>

Oczywiście można ściągnąć bibliotekę MathJax.js (licencja Apache) na swój serwer i odpowiednio zmodyfikować ścieżkę, ale w przypadku Bloggera ta opcja odpada.

Dalej jest prosto - para znaczników \( i \) umożliwia wstawianie formuł matematycznych umieszczanych w linii tekstowej, zaś pary znaczników $$...$$ lub \[...\] umożliwiają wstawianie formuł matematycznych eksponowanych.

Przykład - poniższy kod:

Hamiltonian dla układu <i>N</i>-elektronowego ma postać:
\[ \hat H = \sum_{i=1}^N \hat h(i) + \sum_{i>j=1}^N \hat V_{ij} \]
gdzie \( \hat h(i) \) jest hamiltonianem jednoelektronowym zaś \( \hat V_{ij} \) jest operatorem oddziaływania elektron-elektron.

Macierze Pauliego:
$$
\sigma_x=
\begin{pmatrix}
0 & 1 \\
1 & 0\\
\end{pmatrix}
\qquad
\sigma_y=
\begin{pmatrix}
0 & -i \\
i & 0\\
\end{pmatrix}
\qquad
\sigma_z=
\begin{pmatrix}
1 & 0 \\
0 & -1\\
\end{pmatrix}
$$

daje w wyniku

Hamiltonian dla układu N-elektronowego ma postać:
\[ \hat H = \sum_{i=1}^N \hat h(i) + \sum_{i>j=1}^N \hat V_{ij} \]
gdzie \( \hat h(i) \) jest hamiltonianem jednoelektronowym zaś \( \hat V_{ij} \) jest operatorem oddziaływania elektron-elektron.

Macierze Pauliego:
$$
\sigma_x=
\begin{pmatrix}
0 & 1 \\
1 & 0\\
\end{pmatrix}
\qquad
\sigma_y=
\begin{pmatrix}
0 & -i \\
i & 0\\
\end{pmatrix}
\qquad
\sigma_z=
\begin{pmatrix}
1 & 0 \\
0 & -1\\
\end{pmatrix}
$$


Strona domowa projektu: www.mathjax.org

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}


2014-03-29

3 ciekawe aplikacje, cz. 3

dwb

jest przeglądarką internetową opartą na połączeniu Webkita, Gtk, skrajnego minimalizmu i skrótów klawiaturowych w stylu Vima. Podobnie zresztą jak vimprobable, uzbl, jumanji, luakit, czy surf.


Chociaż dwb wydaje się na pierwszy rzut oka bardzo uproszczony, posiada on wiele funkcji cechujących nowoczesne przeglądarki, tj. zakładki, obsługę ciasteczek i proxy, adblocka, blokowanie flasha i javascriptu, rozszerzenia i skrypty użytkownika.

Gdyby ktoś nie wiedział jak wyjść z dwb, to podpowiem, że wystarczy wpisać :quit ;-)

QtWeb

jest przeglądarką internetową opartą na Webkicie i Qt, zaprojektowaną do bycia aplikacją przenośną.


Ciekawą funkcją QtWeb jest możliwość prostej deaktywacji w locie wczytywania obrazów, skryptów javascript lub flasha (niestety globalnie a nie dla każdej karty z osobna), czyli coś czego brakuje mi w Chrome a co było dobrze zrobione w Operze zanim zchromiała do reszty.

Meld

jest graficznym programem do porównywania zawartości plików tekstowych lub katalogów.


Meld posiada elegancki interfejs użytkownika oraz pozwala na zawijanie długich linii tekstu - co dla mnie jest osobiści ważniejsze, gdyż umożliwia mi to wygodniejsze porównywanie plików źródłowych LaTeX-a, i czego brakowało mi w programie Kompare.