Published: 3. 2. 2007   Category: Typography

Grafy pomocí gnuplotu pro LATEX

Martin Bruchanov (BruXy), bruxy@regnet.cz

Jak udělat hezký graf? Aby ladil oku, zapadal do designu dokumentu, splňoval náročne požadavky na vzhled a sazbu? Odpověď je gnuplot a práci zjednodušující skript pro BASH, který jsem nazval plot.

Díky použitému postupu není problém s diakritikou, s českou desetinnou čárkou a vzhledem. Je primárně určen pro uživatele TEXu.

Požadavky

Proto, aby vše fungovalo jak má je nutné mít v Linuxovém systému nainstalovány následující programy:

Poslední dva jmenovaní jsou použiti při generování výstupu do PNG.

Download

Stáhnout skript plot (5640 bytů).

Aktualizace

Co plot umí?

Nejdříve seznam parametrů příkazové řádku:

Gnuplot to PDF via METAPOST:
Usage:        plot [param] input_file
Parameters:     -e   ... Output to Encapsulated PostScript
                -p   ... Use decimal point instead of ','
                -b N ... change BoundigBox by N (default N = 2)
                -r   ... rasterize to PNG
                -s N ... together with -r define bitmap width N (default N = 640)

A teď k tomu, co to znamená. Protože používám pdfLaTeX potřebuji, aby soubor který vkládám do dokumentu byl ve formátu PDF, volba -e zapne výstup do EPS. Zvětšit okraje obrázku o zadanou velikost v jednotce pt (1/72" tedy 25,4/72 mm) umožňuje volba -b. Protože je u nás zvykem oddělovat celou a desetinnou část čísla čárkou je zde volba -p, která změnu potlačí a oddělovačem bude desetinná tečka. Jelikož chci občas výsledky publikovat i na webu hodí se přepínač -r pro výstup do PNG a s ním související -s, který nastavuje pixelovou šířku obrázku na základě daného argumentu N.

Jak plot funguje

Od vstupu k výstupu vede relativně trnitá cesta, kterou plot dokáže, doufejme zdařile, automatizovat. Operace které provádí jsou následující:

  1. gnuplot zpracuje vstupní soubor a vytvoří zdroják pro metapost;
  2. upraví se zdroják metapostu, přidáním následujícího příkazu:
        verbatimtex
        \mathcode`.="002C
        etex
    		
    Příkaz \mathcode`.="002C řekne TeXu, že desetinným oddělovačem je čárka.
  3. metapost zpracuje vstup a vytvoří obrázek ve formátu Encapsulated PostScript, pro sazbu rovnic a textů si zavolá TeX;
  4. EPS z metapostu neobsahuje fonty, ty se doplňí částečně v tomto kroku, kdy se EPS vloží do LaTeXového zdrojáku a vznikne DVI soubor;
  5. utilitka dvips převede soubor z DVI do Postscriptu, ale tak, že malý graf je vložený na jednu stránku A4;
  6. pro správnou velikost se vytvořený *.ps soubor prožene ps2epsi, ale protože ořez občas není dokonalý, potom změnou parametru BoundingBox (uživatel volí pomocí -b) se uvnitř EPS nastaví větší okraj;
  7. epstopdf zkonvertuje EPS do PDF a je hotovo.
  8. Při výstupu do PNG se obrázek vyrastruje pomocí ghostscriptu a zmenší se na požadovanou velikost utilitkou convert, která pro lepší vzhled ještě provede maskování rozostření (unsharp mask).

Pokud vše proběhne v pořádku, objeví se na terminálu následující výpis:

$ plot test.plot 
Gnuplot processing:                         OK
Metapost translation:                       OK
LaTeX translation:                          OK
DVI to Postsript:                           OK
Bounding box resized by 2:                  OK
Output: PDF 'test.pdf'

Pokud v některém kroku skript zhavaruje s krvavým nápisem FALSE můžete snadno dohledat, kde se stala chyba. Nejčastěji nedopadne dobře krok překladu gnuplotem a nebo metapostem. V prvním případě je chybný některý z gnuplotích příkazů. V druhém případě zhavaruje metapost a to proto, že je špatně zadaný některý z TeXových příkazů uvnitř title, label a podobně.

Použití

Volba terminálu

Gnuplot umí nepřeberné množství výstupních formátů, ale plot vyžaduje METAPOST, takže deklarujte:

Kódování češtiny

Vstupní kódování je ISO-8859-2.

Výstupní soubor

Pro správnou funkci skriptu je nutné nastavit výstupní soubor:

set output "graf.mp"

Formátování matematiky

Aby správně fungovalo sázení matematiky je nutné nastavit formátování pro osy grafu a formátovací string je nutné uzavřít mezi $znaky$, aby TeX věděl, že má použít matematický režim. Kromě toho je to důležité pro to, aby se vysázela desetinná čárka a znak mínus byl v matemat. režimu interpretován jako mínus a ne jako spojovník.

set format y "$%g$"
set format y "$%2.1f$"
set format y "$%s\\cdot{}10^{%S}$"

Pozor na to, že v textu v "uvozovkách" jsou zpracovávány escape sekvecne (\t, \s, \\), v 'uvozovkách' nejsou.

Formátovací znaky jsou následující:

Příklady

Stáhnout všechny příklady. (566 567 bytů).

Příklad 1. Jednoduché otestování možností terminálu:
set output "test.mp"  
set terminal mp color;  
test;  
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad
set output "graf-10.mp"
set term mp "csr10";
set grid;
set tmargin 3;
set key right bottom;
set data style points;
set xtics (1,25,50,75,100,125,150,175,200);
set yrange [0:45];
set xrange [1:200];
set samples 2500;
set xlabel 'Kmitočet $f$ [Hz]';
set ylabel 'Činitel potlačení $K_{pSM}$ [dB]';
plot "graf-10.csv" using 1:3 title 'Naměřená hodnota'\
   with point pointtype 2, \
   20*log10((pi*0.02*x)/abs(sin(pi*0.02*x))) \
   smooth csplines title 'Teoretická hodnota' lt 1;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad
set output "data1_amat.mp"
set term mp color solid "csr10";
set grid;
set data style points;
set format y "$%2.2f$";
set xtics (82 ,84, 86, 88, 90, 92, 94 ,96, 98,\
      100, 102, 104, 106, 108, 110, 112)
set key left top;
set xlabel 'Miss penalty [Clock]'
set ylabel 'AMAT [Clock]';
plot "data1_amat.csv" using 1:2 notitle with point pt 4, \
   "data1_amat.csv" using 1:2 with lines lw 1 lt 2\
     smooth csplines title '1 kB', \
   "data1_amat.csv" using 1:3 notitle with point pt 4, \
   "data1_amat.csv" using 1:3 with lines lw 1 lt 3\
     smooth csplines title '4 kB', \
   "data1_amat.csv" using 1:4 notitle with point pt 4, \
   "data1_amat.csv" using 1:4 with lines lw 1 lt 5\
     smooth csplines title '8 kB' ;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad
set output "gp_girl.mp"
set term mp "csr10";
set nomultiplot;
set noborder
set border 0
set format x " ";
set format y " ";
set nokey;
set nolabel;
set nocontour;
set xtics nomirror;
set ytics nomirror;
set bar -1;
set ytics (" " 0)
set xtics (" " 0)
plot "gp_girl.dat" notitle w l lw 1.2;

		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 5.
set output "graf-11a.mp"
set term mp "csr10" 10;
set grid;
set data style points;
set yrange [-2:2];
set tmargin 3;
set rmargin 3;
set format y "$%.1f$";
set xrange [0:15];
set xlabel 'Vzorek $k$ [--]';
set ylabel 'Vstupní napětí $U$ [V]';
set xtics (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
plot "graf-11a.data" using 1:2 notitle with boxes, \
   "graf-11a.data" using 1:2 smooth csplines notitle 8;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad
set output "sol_all.mp"
set term mp "csr10";
set grid;
set data style points;
set format x "$%g$";
set ylabel 'Intenzinta $H$ [A$\cdot$m$^{-1}$]';
set xlabel 'Vzdálenost od středu $z$ [cm]';
plot "sol1.dat" using 2:4 title '$h = 120$~cm' with point, \
  "sol1.dat" using 2:4 smooth csplines notitle, \
  302.72*((0.6-x/100)/sqrt(0.045**2+(0.6-x/100)**2) +\
  (0.6+x/100)/sqrt(0.045**2+(0.6+x/100)**2) ) smooth csplines notitle lt 1, \
 "sol2.dat" using 2:4 title '$h = 60$~cm' with point, \
  "sol2.dat" using 2:4 smooth csplines notitle, \
  587.67*((0.3-x/100)/sqrt(0.045**2+(0.3-x/100)**2) +\
  (0.3+x/100)/sqrt(0.045**2+(0.3+x/100)**2) ) smooth csplines notitle lt 1, \
 "sol3.dat" using 2:4 title '$h = 30$~cm' with point, \
  "sol3.dat" using 2:4 smooth csplines notitle, \
  1110.42*((0.15-x/100)/sqrt(0.045**2+(0.15-x/100)**2) +\
  (0.15+x/100)/sqrt(0.045**2+(0.15+x/100)**2) ) smooth csplines notitle lt 1, \
 "sol4.dat" using 2:4 title '$h = 15$~cm' with point, \
  "sol4.dat" using 2:4 smooth csplines notitle, \
  1972.78*((0.075-x/100)/sqrt(0.045**2+(0.075-x/100)**2) +\
  (0.075+x/100)/sqrt(0.045**2+(0.075+x/100)**2) ) smooth csplines notitle lt 1;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 7.
set output "graf_zpozdeni.mp" 
set term mp color "csss12";
set grid;
set data style points;
set yrange [0:70];
set xtics (1,4,8,12,16,20,24,32);
set xlabel 'Bitová sčítačka';
set ylabel 'Maximální zpoždění [ns]';
plot "P2POB.txt" using 1:2 notitle with point, \
   "P2POB.txt" using 1:2 smooth bezier notitle;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 8.
set output "gaus.mp"
set term mp color "csr10"; 
set format y "$%2.0f$" 
set format x "$ %2.0f$" 
set format z "$ %2.1f$" 
set grid; 
set tmargin 3; 
set rmargin 3; 
set bmargin 3;
set dgrid3d;
set yrange [-3:3]; 
set xrange [-3:3]; 
set samples 2500; 
set hidden3d 
set ticslevel 0.2
set isosample 50
sigma = 0.75;
splot 1/(2*pi*sigma**2)*exp(-((x**2+y**2)/(2*sigma**2))) notitle;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 9.
set output "ukol6.mp";
set term mp "csr10";
set grid;
set key left bottom;
set data style points;
set format x "$%2.1f$";
set logscale x;
set title '\font\tucny=csssbx12 \tucny Frekvenční charakteristika zesilovače'
set ylabel 'Zisk \qquad $20\log {U_2\over U_1}$ [dB]';
set xlabel 'Kmitočet $f$ [kHz]';
plot "ukol6.dat" using ($1/1000):(20*log10($2/0.0946)) \
     title 'Rozkmit $U_{sat}-5$~\%' with point, \
   "ukol6.dat" using ($1/1000):(20*log10($2/0.0946)) \
     smooth csplines notitle lt 1, \
   "ukol6.dat" using ($1/1000):(20*log10($3/0.0716)) \
     title 'Rozkmit $U_{sat}-10$~\%' with point, \
   "ukol6.dat" using ($1/1000):(20*log10($3/0.0716)) \
     smooth csplines notitle;

		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 10.
set output "dct_u4.mp"
set term mp color "csr12";
set format y "$%2.1f$"
set nogrid;
set tmargin 3;                                           
set rmargin 3; 
set size square;
set yrange [-1:1];
set xrange [0:7];
set samples 2500;
set xlabel '$x$ [n]';
plot "data.txt" using 1:6 notitle with boxes, \
  cos(((2*x+1)*4*1*pi)/16) smooth csplines notitle lt 2;
		
[ PDF varianta ] [ Gnuplot + data ]
Příklad 11.
set output "sinuses.mp"
set term mp color solid "csr10";
set grid;
set key left top;
set format x "$%0.2P\\pi$";
set xtics (-asin(90),-asin(90)/2, 0,asin(90)/2, asin(90))
set format y "$%1.1f$";
set xrange [-asin(180):asin(180)];
plot sin(x) title '$\sin(x)$', \
     sin(2*x) title '$\sin(2x)$', \
     cos(3*x) title '$\cos(3x)$';
		
[ PDF varianta ] [ Gnuplot + data ]

Vkládání obrázku do pdfLATEXu

\pdfoutput=1
\documentclass[a4paper, 11pt, pointednumbers]{scrartcl}
\usepackage{czech}
\usepackage{graphics}

\begin{document}


  \begin{figure}
    \begin{center}                                                                              
       \scalebox{0.9}{
          \includegraphics{graf.pdf}
       }                                 
    \end{center}    
    \caption{Grafík na kterém je to všechno vidět.}
  \end{figure}

\end{document}

Další informace ke gnuplotu