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 etexPří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}