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.
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.
Stáhnout skript plot (5640 bytů).
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.
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í:
verbatimtex
\mathcode`.="002C
etex
Příkaz \mathcode`.="002C řekne TeXu, že desetinným oddělovačem je čárka.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ě.
Gnuplot umí nepřeberné množství výstupních formátů, ale plot vyžaduje METAPOST, takže deklarujte:
set term mp "csr10";
set term mp color "csr10";
set term mp color solid "csr10";
Vstupní kódování je ISO-8859-2.
Pro správnou funkci skriptu je nutné nastavit výstupní soubor:
set output "graf.mp"
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í:
Stáhnout všechny příklady. (566 567 bytů).
|
Jednoduché otestování možností terminálu:
set output "test.mp" set terminal mp color; test; |
| [ PDF varianta ] | [ Gnuplot + data ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
|
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 ] |
\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}