úterý 19. ledna 2016

Směrové charakteristiky gnuplot (Radiation patters in gnuplot - script)

Při psaní diplomové práce jsem stál před rozhodnutím v čem udělat polární graf se směrovými charakteristikami. Tyhle možnosti se mi nabízely: Matlab, scilab, calc, excel, gnuplot. Používám linux a proto jsem se rozhodl vyzkoušet gnuplot o kterém jsem slyšel že umí vážně pěkné grafy. Nějakou dobu jsem hledal vhodný skript, který by mi grafy vykreslil, ale žádný nedosahoval takového vzhledu grafu jaký jsem si představoval. No a tak jsem začal tvořit sám. Na následujících řádcích popíšu jednotlivé funkcionality skriptu a co je třeba udělat aby byl graf použitelný.

Nejprve je nutné provést přípravu souboru s daty, která chceme vykreslit. Je dobré mít data v textovém souboru ve dvou a více sloupcích. V prvním sloupku je úhel ve stupních a v dalším jsou hodnoty. Pozor jako desetinné oddělovače je nutné použít tečky. Data mohou vypadat následovně:

                                                                  91    -0.5206
                                                                  92    -0.4429
                                                                  93    -0.3713
                                                                  94    -0.3063
                                                                  95    -0.2484
                                                                  96    -0.1983
                                                                  97    -0.1561
Nejprve uvedu jak jsem došel k tomuto skriptu, výsledný skript bude ke stažení na konci článku a bude ho možné zadat rovnou zkopírováním do gnuplotu.
Gnuplot nainstalujte tak jak jste zvyklí a spusťte ho v konzoli nejlépe v místě kde máte před-připravený textový soubor s daty.

Nejprve začneme definicí polárního grafu a úhlu ve stupních, další 3 řádky nastavují jakési velikosti. Set key font nastavuje umístění a velikost legendy v našem grafu. Set key outside nastavuje legendu do vnější oblasti grafu.

set angle degree
set polar
set size ratio 1
set tmargin 3
set bmargin 3
set key font ",12" right
set key outside

Další řádek nastavuje název grafu a velikost písma. To co je psáno v uvozovkách je možné měnit.

set title "Směrová charakteristika" font ",15"

Pokračuje definice stylu a barvy mřížky, nastavení mřížky na polární a zákaz zobrazení rámečku, osy x a osy y. Poslední parametr zakazuje osu hodnot na polárním grafu. Zakomentováním a odkomentováním řádku číslo dvě dostaneme plné čáry místo tečkovaných.

set grid polar 10 lc rgb "gray30"
set grid layerdefault lt 0 linewidth 1,  lt 0 linewidth 1
set style data lines lw 2
unset border
unset xtics
unset ytics
unset raxis

Další nastavení je nastavení, které je možné celkem úspěšně měnit. V prvním případě se mění krok po kterém bude vykreslována mřížka úhlů. Hodnotami rmin a rmax nastavujeme rozsah na ose hodnot.

set grid polar 30
rmin = -30
rmax = 10

Nyní následují tři složitější řádky. Prvním nastavujeme rozsah pomocí výše definovaných proměnných. Druhým říkáme jaký bude popisek na ose hodnot. Definujeme jeho posunutí tak aby nebyl přes čáry, rotaci zrcadlení. Změny může každý vyzkoušet. Třetí řádek je řádek funkce. Ta nám dělá popisky na ose úhlu. Popis je zdlouhavější a funkci každý rychle pochopí. (Vše musí být na jednom řádku, sem to tak ale nedostanu tak pozor).

                                                        set rrange[rmin:rmax]
                           set rtics axis scale 0.5,0 nomirror rotate by 0  offset 1, 0

set_label(x, text) = sprintf("set label '%s' at (((abs(rmin)+rmax)+5)*cos(%f)), (((abs(rmin)+rmax)+5)*sin(%f))     center", text, x, x) #this places a label on the outside

set_label2(x, text) = sprintf("set label '%s' at (0), (-50) center font ',12'", text, x, x) #this places a label on the outside

Dále následuje provedení funkce, to jest vykreslení stupňů tam kde mají být. Na posledním řádku ještě vykresluji popisek.

                                                        eval set_label(90, "0°")
                                                        eval set_label(120, "-30°")
                                                        eval set_label(150, "-60°")
                                                        eval set_label(180, "-90°")
                                                        eval set_label(210, "-120°")
                                                        eval set_label(240, "-150°")
                                                        eval set_label(270, "180°")
                                                        eval set_label(300, "150°")
                                                        eval set_label(330, "120°")
                                                        eval set_label(360, "90°")
                                                        eval set_label(30, "60°")
                                                        eval set_label(60, "30°")
                                                        eval set_label2(270, "Directivity [dBi]")

Tak vykreslení se provede pomocí příkazu plot. Já tady uvedu příklad pro vykreslení více křivek do jednoho grafu. Data jsou uložena ve sloupcích v tak jak je nazanačeno na začátku. Za příkazem plot probíhá vykreslení dvou pomocnych křivek pro lepší orientaci v grafu na hodnotě 5 a 15.

plot 5 dt 3 lw 1 lc rgb "gray30" notitle, 15 dt 3lw 1 lc rgb "gray30" notitle, "test.csv" using ($1):($2) title 'prvni sloupec' ls 1 lw 2 lc 1, "test.csv" using ($1):($3) title 'druhy sloupec' ls 2 lw 2 lc 2

Výsledek je potom možné exportovat do vektorového formátu svg a dále upravovat například pomocí inkscape.

Tak a takhle může vypadat výsledek. Myslím že je celkem podařený a za tu práci to stálo. Mějte se.

Tady je soubor se skriptem, asi je třeba doplnit příponu. http://uloz.to/xpJFV7bq/polargraph-zip