Úvod do SASu pro Windows - Část IV.
Grafický modul SAS/GRAPH

SAS je registrovaná ochranná známka SAS Institute, Inc., Cary, NC, USA

(c) 2000 Michal Kulich, 1998 Oliver Schabenberger


1. Filosofie SAS/GRAPHu

2. Nastavení GOPTIONS

2.1 GOPTIONS pro obrazovku a laserovou tiskárnu
2.2 Nastavení orientace na šířku
2.3 Uložení grafu v daném grafickém formátu

3. Dvourozměrné diagramy

3.1 Rozptylový diagram
3.2 Kreslící symboly závislé na podskupině
3.3 Přidání legendy
3.4 Anotační soubory

4. Histogramy

4.1 Obyčejný histogram
4.2 Paralelní histogramy
4.3 Rozdělené histogramy

5. Kreslení více grafů na stránku


1. Filosofie SAS/GRAPHu

SAS původně nabízel pouze jednoduché znakové obrázky, jaké dosud vytváří např. PROC UNIVARIATE. Ty se daly prohlížet na textovém terminálu nebo tisknout na řádkové tiskárně. Časem došlo k masovému rozšíření grafických obrazovek a tiskáren a SAS se této skutečnosti přizpůsobil tím, že začal dodávat přídavný modul SAS/GRAPH. Tento modul obsahuje řadu příkazů ke kreslení, ovládání grafické podoby obrázků a nastavování různých parametrů. Příkazy se píší do PROGRAM EDITORU a spouštějí se stejně jako jiné SASové procedury. Výsledné obrázky lze prohlížet na obrazovce, tisknout na tiskárně nebo ukládat ve zvoleném formátu. SAS/GRAPH je velmi složitý systém s nepříliš průhledným ovládáním, který stojí zcela samostatně a nijak nekomunikuje s ostatními výpočetními procedurami. Je proto často nutné před kreslením požadovaného obrázku dlouho a pracně připravovat data do vhodného formátu. Podle názoru překladatele tohoto manuálu je to nepříjemně těžkopádné.

Vzhledem ke složitosti modulu SAS/GRAPH zde nepodáváme ucelený výklad jeho možností a schopností, ale uvádíme jen několik ilustračních příkladů ukazujících základní způsoby ovládání procedur SAS/GRAPHu. Čtenáře lačného dalších podrobností odkazujeme na několik svazků oficiálního manuálu pro modul SAS/GRAPH. Jeden zvláště palčivý problém, kterým se zde nebudeme zabývat, je použití českých fontů v grafických výstupech. Pokud existuje nějaký způsob, jak dostat háčky a čárky do titulků a popisků našich obrázků, je dostatečně komplikovaný na to, aby ho překladatel tohoto dílka objevil.

2. Nastavení GOPTIONS

GOPTIONS jsou grafické přepínače, které nastavují výstupní zařízení (device, tj. obrazovka, typ tiskárny, formát diskového souboru) a různé vlastnosti grafu, jako velikost, orientace atd. Nastavením GOPTIONS si lze ušetřit opakované uvádění týchž příkazů a přepínačů uvnitř grafických procedur. Úplný seznam všech použitelných přepínačů nalezneme postupnou volbou Help/SAS System/SAS System Help: Main Menu/ Graphics/Graphics Statements & Windows/Goptions

2.1 GOPTIONS pro obrazovku a laserovou tiskárnu

Následující příkaz je vhodný pro tisk na HP Laserjet 4 ve svislé orientaci:

GOPTIONS DEVICE=win
         TARGETDEVICE=ljivps GUNIT=cm HBY=0
         VSIZE=25.0 cm HSIZE=16.0 cm NOBORDER
         NOPROMPT DISPLAY;

Přepínač DEVICE=win přikazuje SASu vytvořit nejprve výstup na obrazovku. Vypadá-li obrázek podle vašich představ, můžete ho vytisknout nebo uložit. Obrázek je formátován pro výstup na zařízení specifikované přepínačem TARGETDEVICE=. V tomto případě se bude tisknout na tiskárně HP Laserjet 4 s postscriptem. Přepínač GUNIT= volí implicitní jednotku měření délek. Standartní jednotkou je palec (in). HBY= stanovuje tloušťku čáry (v jednotkách GUNIT) oddělující grafy pro jednotlivé podskupiny při použití příkazu BY (BY se v grafické proceduře používá stejně jako uvnitř datové procedury). Vynulování HBY zruší nejen tyto dělící čáry, ale i automatické hlavičky, které jinak SAS nad každým grafem vytváří. VSIZE= a HSIZE= definují svislý a vodorovný rozměr oblasti, do níž se vykreslí obrázek. Naše volba ponechává na papíře A4 zhruba dvoucentimetrové okraje. NOBORDER potlačuje rámeček okolo grafu, NOPROMPT potlačuje tisk různých výzev, takže grafy se zobrazují ihned, jakmile jsou hotovy. DISPLAY žádá SAS, aby obrázky nejen připravil, ale také zobrazil. Někdy chceme zobrazit obrázek později, například když jich potřebujeme umístit více na jednu stránku. V takovém případě zadáme volbu NODISPLAY před jejich vytvořením a přepneme na GOPTIONS DISPLAY teprve až je budeme chtít sestavit do jednoho výstupu.

Seznam všech dostupných výstupních zařízení dostanete po spuštění příkazu

PROC GDEVICE; RUN;

Mezi nimi je několik vhodných pro tisk na laserových tiskárnách, liší se rozlišením, formátem papíru a použitím postscriptu.

2.2 Nastavení orientace na šířku

Pro některé tiskárny existuje DEVICE, které samo způsobí vykreslení obrázku na šířku stránky. Jinak nezbývá než nastavit přepínač ROTATE= a prohodit VSIZE a HSIZE:

GOPTIONS VSIZE=16.0 cm HSIZE=25.0 cm ROTATE=landscape;

2.3 Uložení grafu v daném grafickém formátu

Jakýkoli graf zobrazený na obrazovce můžeme nechat uschovat na disk ve specifickém formátu. Je nicméně možné vygenerovat obrázek přímo v požadovaném formátu a nechat jej uložit ve zvoleném souboru pomocí příkazů FILENAME a GOPTIONS. Řekněme, že chceme obrázek převést do formátu GIF a uschovat v souboru obraz.gif v určitém direktoráři. Provedeme to takto. Nejprve přiřadíme výslednému souboru SASovou přezdívku (fileref) příkazem FILENAME

FILENAME nasobr 'c:\mujdir\obrazky\obraz.gif';

a potom stanovíme příkazem GOPTIONS, že výsledný obrázek se má zapsat ve formátu GIF do tohoto souboru:

GOPTIONS GSFMODE=replace GSFNAME=nasobr DEVICE=gif;

Volba GSFMODE=replace říká SASu, že příslušný soubor má přepisovat bez ptaní. Obrázek se neukládá automaticky hned, jakmile je vytvořen. Pro jeho uložení lze použít například volbu File/Print a zaškrtnout Print to file bez uvedení jména souboru.

Obrázky můžeme ukládat mimo jiné v následujících formátech:

Formát DEVICE=
BMP imgbmp
GIF gif, imggif, ...
JPEG imgjpeg
Postscript ps, ps300a4, ...
EPS psepsfa4, ...

3. Dvourozměrné diagramy

Diagramy vytvářené v této kapitole se budou týkat datového souboru, který obsahuje výsledky simulační studie na sílu tří testů založených na různých metodách odhadu. Jednotlivé metody jsou značeny CRF, ERF a SPD (veličina ANALYS). Generovaná data se lišila stupněm závislosti (hodnoty 50, 100 a 200 veličiny RANGE) a rozdílem mezi středními hodnotami (hodnoty 0, 1, 2, 3, 4 veličiny TRUED). Chceme graficky vyjádřit závislost síly testu POWER05 na rozdílu mezi středními hodnotami TRUED.

Vypisujeme jen prvních několik pozorování, celý soubor si můžete prohlédnout zde.

DATA power;
  INPUT range analys $ trueD power05 cnt;
  DATALINES;
  50     CRF       0      0.04080     1
  50     CRF       1      0.08425     1
  50     CRF       2      0.17533     1
  50     CRF       3      0.34800     1
  50     CRF       4      0.54400     1
  50     ERF       0      0.15980     2
  < a tak dále ... >
;
RUN;
PROC SORT DATA=power; BY range analys trued; RUN;

Všimněte si, že data byla setříděna podle veličin RANGE, ANALYS a TRUED.

3.1. Rozptylový diagram

Nyní si ukážeme, jak v SASu vytvořit rozptylový diagram. Bude nás zajímat závislost veličiny POWER05 (svislá osa) na veličině TRUED (vodorovná osa). Obrázek chceme zobrazit na obrazovce a uschovat do souboru ve formátu GIF. Nejprve nastavíme grafické přepínače (viz kapitola 2).

FILENAME nasobr 'obr1.gif';
GOPTIONS DEVICE=win TARGETDEVICE=gif GUNIT=cm HBY=0
         VSIZE=16.0 cm HSIZE=14.0 cm NOBORDER NOPROMPT DISPLAY
         GSFMODE=replace GSFNAME=nasobr;

Rozptylový diagram vytváří grafická procedura GPLOT. Pro začátek ji zkusíme spustit v naprosto minimální konfiguraci:

PROC GPLOT DATA=power;
     PLOT power05*trued;
RUN; QUIT;
Příkaz PLOT určuje, co se má kreslit: nejprve udáme jméno závislé veličiny (POWER05), pak jméno nezávislé veličiny (TRUED) oddělené hvězdičkou. Výsledek (k nahlédutí zde) je poněkud neuspokojující. Nezbývá, než se pokusit pozměnit jeho vzhled k lepšímu. Začneme se specifikací podoby kreslících symbolů. K tomu slouží přepínače SYMBOLn. Můžeme si nastavit libovolné množství těchto přepínačů (SYMBOL1, SYMBOL2, atd.) a při kreslení obrázků mezi nimi volit. My si nastavíme přepínač SYMBOL1 a ihned jej použijeme:
SYMBOL1 C=black H=0.3 I=none L=1 V=circle;
PROC GPLOT DATA=power;
     PLOT power05*trued = 1;
RUN; QUIT;

Příkaz SYMBOL1 použitý v tomto příkladě říká, že symboly se mají kreslit černě (COLOR=black, zkráceně C=black), 3 mm veliké (HEIGHT=0.3, zkráceně H, a centimetr je zvolená GUNIT), nemají se spojovat čarou (INTERPOL=none, zkr. I). Čára, kterou by se symboly spojovaly, by byla plná (LINE=1, zkr. L) a budou se kreslit kolečka (VALUE=circle, zkr. V). Specifikace =1 v příkazu PLOT power05*trued=1 způsobí, že se pro kreslení použije symbol definovaný příkazem SYMBOL1. Zde je GIF-výstup.

Nyní se pokusíme předělat osy grafu, které jsou stále velmi nepěkné. Použijeme přepínač AXISn, kde n má podobný smysl jako u SYMBOLn. Zadefinujeme dvě podoby os, AXIS1 pro osu vodorovnou a AXIS2 pro osu svislou.

AXIS1 LENGTH=10
      ORIGIN=(2, 2)
      WIDTH = 2
      OFFSET=(0.5, 0.5)
      VALUE=(COLOR=black FONT=centb HEIGHT=0.3)
      MAJOR=(COLOR=black HEIGHT=0.3 WIDTH=2)
      MINOR=(COLOR=black HEIGHT=0.2 WIDTH=1 N=1)
      LABEL=(COLOR=black HEIGHT=0.4 FONT=centb 'Skutecny rozdil');
AXIS2 LENGTH=12
      ORIGIN=(2, 2)
      WIDTH =2
      OFFSET=(0.5, 0.5)
      ORDER =(0 TO 1 BY 0.10)
      VALUE=(C=black F=centb H=0.3)
      MAJOR=(C=black H=0.3 W=2)
      MINOR=(C=black H=0.2 W=1 N=3)
      LABEL=(C=black H=0.4 F=centb A=90 'Sila testu');
PROC GPLOT DATA=POWER;
     PLOT power05*trued = 1 / HAXIS=axis1 VAXIS=axis2;
RUN; QUIT;

LENGTH určuje délku osy v cm, ORIGIN je poloha počátku osy počítáno v cm od levého dolního rohu, WIDTH je tloušťka osy (hodnoty 1, 2 atd.), OFFSET určuje, kolik místa se má vynechat na začátku a na konci osy, ORDER definuje počet odrážek na ose a jejich umístění, VALUE jejich popisky. MAJOR a MINOR určují tvar popsaných a nepopsaných odrážek, LABEL je popiska osy. Jelikož osa AXIS2 bude svislá, je nutné otočit popisek do svislého směru volbou ANGLE=90. Klíčová slova pro barvu, font, výšku, tloušťku atp. lze zkracovat prvním písmenem (viz AXIS2). V příkazu PLOT jsme pak za lomítkem požádali o použití osy AXIS1 jako vodorovné (HAXIS=AXIS1) a osy AXIS2 jako svislé (VAXIS=AXIS2). Zde je k nahlédnutí výsledek.

Často chceme k obrázku přidat nějaký nadpis nebo jiný text. Toho můžeme dosáhnout použitím příkazu TITLEn anebo FOOTNOTEn:

AXIS2 LENGTH=11
      ORIGIN=(2, 2)
      WIDTH =2
      OFFSET=(0.5, 0.5)
      ORDER =(0 TO 1 BY 0.10)
      VALUE=(C=black F=centb H=0.3)
      MAJOR=(C=black H=0.3 W=2)
      MINOR=(C=black H=0.2 W=1 N=3)
      LABEL=(C=black H=0.4 F=centb A=90 'Sila testu');
PROC GPLOT DATA=power;
  TITLE1 F=centb H=0.7 "Sila testu";
  TITLE2 F=centb H=0.5 "jako funkce skutecneho rozdilu str. hodnot";
  PLOT power05*trued = 1 / HAXIS=axis1 VAXIS=axis2 ;
RUN; QUIT;

Nad obrázkem jsme vyrobili dvouřádkový titulek (pozřete zde). Museli jsme přitom trochu zkrátit svislou osu, abychom pro titulek udělali místo. Máme-li délkové specifikace takové, že na kreslicí ploše není dost místa, SAS odmítne obrázek vytvořit.

Na závěr ještě jedno upozornění. Příkazy jako TITLEn, AXISn mohou být umístěny kdekoli v SASovém programu, i uvnitř grafické procedury (jako je GPLOT). Jejich platnost je však vždy globální. Jednou přepnutý přepínač zůstává v tomtéž stavu, dokud není změněn, nebo dokud není ukončen běh SASu. Například náš posledně definovaný titulek se bude objevovat nade všemi nadále vytvářenými obrázky a jinými výstupy, dokud jej nezrušíme jiným příkazem TITLEn. Totéž se týká os. Všechny titulky najednou můžeme zrušit příkazem title; a všechny osy příkazem axis;.

3.2 Kreslící symboly závislé na podskupině

V předchozích příkladech příkaz

PLOT power05*trued = 1 / ...

přikazoval SASu používání určitého grafického symbolu. Často však potřebujeme v obrázku rozlišit data pocházející z různých podskupin. Rádi bychom tedy měnili barvu, tvar nebo velikost symbolů podle toho, z jaké podskupiny dané pozorování pochází. Toho můžeme docílit zavedením několika definic SYMBOLn, mezi nimiž pak při kreslení vybíráme podle hodnoty veličiny, která definuje rozřazení do skupin. V našem případě chceme porovnat síly tří testů mezi sebou a ono rozřazení nám bude dávat veličina ANALYS (také by šlo CNT). Pro jednoduchost se omezíme na pozorování se stupněm závislosti RANGE=100:

SYMBOL1 C=black H=0.3 I=none L=1 V=circle;
SYMBOL2 C=black H=0.3 I=none L=1 V=plus;
SYMBOL3 C=black H=0.3 I=none L=1 V=diamond;
AXIS1 LENGTH=10
      ORIGIN=(2, 4.5)
      WIDTH =2
      OFFSET=(0.5, 0.5)
      VALUE=(COLOR=black FONT=centb HEIGHT=0.3)
      MAJOR=(COLOR=black HEIGHT=0.3 WIDTH=2)
      MINOR=(COLOR=black HEIGHT=0.2 WIDTH=1 N=1)
      LABEL=(COLOR=black HEIGHT=0.4 FONT=centb 'Skutecny rozdil');
AXIS2 LENGTH=8
      ORIGIN=(2, 4.5)
      WIDTH= 2
      OFFSET=(0.5, 0.5)
      ORDER =(0 TO 1 BY 0.10)
      VALUE=(C=black F=centb H=0.3)
      MAJOR=(C=black H=0.3 W=2)
      MINOR=(C=black H=0.2 W=1 N=3)
      LABEL=(C=black H=0.4 F=centb A=90 'Sila testu');
PROC GPLOT DATA=power(WHERE=(range=100));
     PLOT power05*trued = analys/ HAXIS=axis1 VAXIS=axis2;
RUN; QUIT;

Příkaz PLOT POWER05*TRUED=ANALYS říká, že se má ke kreslení používat SYMBOL1, SYMBOL2 nebo SYMBOL3 podle toho, jakých hodnot nabývá veličina ANALYS. Museli jsme zároveň předělat obě osy, neboť SAS automaticky přidal pod obrázek velmi ošklivou legendu (posuďte sami), na níž potřeboval místo.

3.3. Přidání legendy

Příkaz

PLOT power05*trued = analys/ HAXIS=axis1 VAXIS=axis2;

způsobil vypsání nepěkné legendy do spodní části obrázku. Můžeme si s tím poradit několika způsoby:

  1. Legendu zcela potlačit nastavením přepínače NOLEGEND:

    PLOT Power05*trued = analys/ HAXIS=axis1 VAXIS=axis2 NOLEGEND;
  2. Použít anotaci místo legendy.

  3. Vytvořit lepší legendu.

Zde si vysvětlíme třetí způsob. Legendu zavedeme příkazem LEGEND1.

LEGEND1 ACROSS=1
        DOWN  =3
        FRAME POSITION=(top left inside)
        MODE  =share
        VALUE =(F=centb H=0.35 C=black 'Correct Random Field'
                                       'Estimated Random Field'
                                       'Split Plot Design')
        LABEL =(F=centb H=0.5 C=black 'Metoda odhadu:');

Chceme legendu ve třech řádcích (DOWN=3) a jednom sloupci (ACROSS=1) umístěnou vlevo nahoře uvnitř os grafu (FRAME POSITION=) a specifikovali jsme popisky pro všechny tři metody odhadu (VALUE=). Správné pořadí popisků je třeba zjistit empiricky.

Nyní obrázek překreslíme i s novou legendou, ale tentokrát necháme spojit symboly plnou tenkou čarou (I=JOIN) a znovu trochu upravíme osy:

SYMBOL1 C=black H=0.3 I=join L=1 V=circle  W=1;
SYMBOL2 C=black H=0.3 I=join L=1 V=plus    W=1;
SYMBOL3 C=black H=0.3 I=join L=1 V=diamond W=1;
AXIS1 LENGTH=12
      ORIGIN=(2, 2)
      WIDTH =2
      OFFSET=(0.5, 0.5)
      VALUE=(COLOR=black FONT=centb HEIGHT=0.3)
      MAJOR=(COLOR=black HEIGHT=0.3 WIDTH=2)
      MINOR=(COLOR=black HEIGHT=0.2 WIDTH=1 N=1)
      LABEL=(COLOR=black HEIGHT=0.4 FONT=centb 'Skutecny rozdil');
AXIS2 LENGTH=11
      ORIGIN=(2, 2)
      WIDTH =2
      OFFSET=(0.5, 0.5)
      ORDER =(0 TO 1 BY 0.10)
      VALUE=(C=black F=centb H=0.3)
      MAJOR=(C=black H=0.3 W=2)
      MINOR=(C=black H=0.2 W=1 N=3)
      LABEL=(C=black H=0.4 F=centb A=90 'Sila testu');
PROC GPLOT DATA=power(WHERE=(range=100));
     PLOT power05*trued = analys/ HAXIS=axis1 VAXIS=axis2
     LEGEND=legend1;
RUN; QUIT;

Výsledný obrázek vypadá vskutku o mnoho lépe.

3.4 Anotační soubory

Anotační soubor je datový soubor, jenž obsahuje instrukce pro kreslení značek a popisků do grafu, jejich formátování atd. Z anotačního souboru lze vytvořit i celý graf včetně vykreslení datových hodnot, spojovacích čar aj. Zde nebudeme podrobně vysvětlovat, jak se anotační soubor tvoří, ale ukážeme dva jednoduché příklady jeho použití.

Nejprve vytvoříme anotační soubor, který definuje umístění popisku označujícího druh odhadu (ANALYS) k pozorováním s rozdílem středních hodnot TRUED=3. I nadále pracujeme pouze s RANGE=100. Anotační soubor je normální datový soubor, takže jej vytvoříme datovou procedurou.

DATA anno;
  LENGTH function color style $8 text $20;
  RETAIN color 'black' style 'swiss' hsys '3' xsys ysys '2' ;
  SET power(WHERE=(range=100));
  IF trued=3 THEN DO;
     function='label';
     text = analys;
     angle=0;
     x = trued; y = power05;
     size=3;
     position = '6';
     OUTPUT;
  END;
RUN;

Výsledný anotační soubor ANNO byl vytvořen v datové smyčce. Nejprve byl načtena část souboru POWER s RANGE=100 a pro každé pozorování s TRUED=3 bylo vytvořeno jedno výstupní pozorování v anotačním souboru udávající, na jaké místo a v jakém stylu se mají vypisovat značky (labels). Nyní uplatníme tento anotační soubor při kreslení grafu takto:

PROC GPLOT DATA=power(WHERE=(range=100));
     PLOT power05*trued = analys/ HAXIS=axis1 VAXIS=axis2
                                  ANNOTATE=anno NOLEGEND;
RUN; QUIT;

Ve vytvořeném obrázku jsou skutečně označena pozorování s TRUED=3. Bohužel, popisky se poněkud slévají a jejich estetičtější umístění by nejspíš vyžadovalo ruční manipulaci s obsahem souboru ANNO.

Nyní si nakreslíme sílu testů jen pro odhad SPD, ale zato doplníme do grafu číselnou hodnotu síly pro každý vykreslený bod. Za tím účelem vytvoříme jiný anotační soubor s upravenou veličinou TEXT.

DATA anno;
  LENGTH function color style $8 text $20;
  RETAIN color 'black' style 'swiss' hsys '3' xsys ysys '2';
  SET power(WHERE=((range=100) AND (analys='SPD')));
  function='label'; text = left(put(power05,4.2));
  angle=0; x = trued; y = power05; size=3; position = '2';
OUTPUT;
RUN;
PROC GPLOT DATA=power(WHERE=((range=100) AND (analys='SPD')));
     PLOT power05*trued = analys/ HAXIS=axis1 VAXIS=axis2
                                  ANNOTATE=anno NOLEGEND;
RUN; QUIT;

Zde je k nahlédnutí výsledný obrázek.

4. Histogramy

4.1. Obyčejný histogram

Histogramy vytváří procedura GCHART. Ta se též používá ke kreslení vertikálních a horizontálních blokových diagramů (bar charts) a diskových diagramů (pie charts). Zde si nakreslíme histogram náhodného výběru z chí-kvadrát rozdělení se šesti stupni volnosti.

Nejprve je třeba vygenerovat data. Zvolíme rozsah 1000 a spustíme

DATA chi2;
  DO i = 1 TO 1000;
      x = 2*rangam(1234,3);
      OUTPUT;
  END;
RUN;

Nyní definujme osy a nakresleme histogram:

AXIS1 LENGTH = 12
      ORIGIN=(2, 2) WIDTH=1
      OFFSET=(0.5, 0.5)
      VALUE=(C=black F=centb H=0.5)
      LABEL=(C=black H=0.5 F=centb 'Hodnota Chi^2');
AXIS2 LENGTH = 13
      ORIGIN=(2, 2) WIDTH=1
      OFFSET=(0, 0.5)
      VALUE=(C=black F=centb H=0.5)
      MAJOR=(C=black H=0.2 W=2)
      MINOR=(C=black H=0.1 W=1 N=1)
      LABEL=(C=black H=0.5 F=centb A=90 'Procent');
PROC GCHART DATA=chi2;
   VBAR x / TYPE=percent
            LEVELS=10
            RAXIS =axis2
            MAXIS =axis1;
RUN; QUIT;

Histogram se tedy kreslí příkazem VBAR, za nímž následuje jméno veličiny a za lomítkem volby a přepínače. Zadali jsme, že na svislou osu se mají vynášet procenta (TYPE=PERCENT), nikoli četnosti (to by bylo TYPE=FREQ), že histogram má mít 10 sloupců (LEVELS=10) a že vodorovná osa (MAXIS=) je AXIS1 a svislá osa (RAXIS) je AXIS2. Takhle vypadá výsledek.

Na vodorovnou osu se vynáší prostředky sloupců. Počet, šířku a polohu sloupců histogramu můžeme určit třemi způsoby:

  1. Zvolíme počet sloupců volbou LEVELS= (viz výše).
  2. Zvolíme explicitně polohu prostředků všech sloupců volbou MIDPOINTS= (například MIDPOINTS=1 to 30 by 2).
  3. Necháme SAS automaticky určit počet a umístění spoupců (nezadáme ani LEVELS= ani MIDPOINTS=).

4.2 Paralelní histogramy

K vytvoření dvou nebo více histogramů vedle sebe stačí mít veličinu, jež určí, do kterého histogramu pozorování patří, a zadat její jméno jako argument přepínače GROUP= příkazu VBAR v proceduře GCHART. Vygenerujme znovu náhodný výběr 1000 pozorování z rozdělení chí-kvadrát se šesti stupni volnosti a k němu přidejme náhodný výběr 1000 pozorování z rozdělení N(6,12).

DATA chi2;
  LENGTH dist $7;
  DO i = 1 TO 2000;
      IF i <= 1000 THEN DO;
        x = 2*rangam(1234,3); dist='Chi(6)';
      END; ELSE DO;
        x = 6 + Sqrt(12)*rannor(1234); dist='N(6,12)';
      END;
      OUTPUT;
  END;
RUN;

Veličina DIST označuje, o jaké rozdělení jde. Nyní nakreslíme paralelní histogramy obou výběrů do jednoho obrázku. Nejprve musíme upravit vodorovnou a svislou osu a zadefinovat třetí osu, která bude popisovat oba histogramy:

AXIS1 ORIGIN=(2.5, 4) WIDTH=1
      OFFSET=(0.1, 0.1)
      VALUE=(C=black F=centb H=0.3)
      LABEL=NONE;
AXIS2 LENGTH = 10
      ORIGIN=(2.5, 4) WIDTH=1
      OFFSET=(0, 0.5)
      VALUE=(C=black F=centb H=0.5)
      MAJOR=(C=black H=0.2 W=2)
      MINOR=(C=black H=0.1 W=1 N=1)
      LABEL=(C=black H=0.5 F=centb A=90 'Cetnost');
AXIS3 LENGTH = 11
      ORIGIN=(2.5, 4) WIDTH=1
      OFFSET=(0.5, 0.5)
      VALUE=(C=black F=centb H=0.5)
      LABEL=NONE;
PROC GCHART DATA=chi2;
   VBAR x / TYPE=freq
            GROUP=dist
            LEVELS=10
            RAXIS =axis2
            MAXIS =axis1
            GAXIS =axis3;
RUN; QUIT;

GAXIS je ona třetí osa pro rozdělení do skupin. Zde je výsledný obrázek.

4.3 Rozdělené histogramy

Někdy dáváme přednost rozdělení sloupců histogramu podle podskupin namísto zobrazování několika histogramů vedle sebe. Takový rozdělený histogram vytvoříme zadáním jména proměnné, která definuje rozdělení do skupin, jako argumentu přepínače SUBGROUP= příkazu VBAR. Následující datový soubor obsahuje údaje o výši obratu fiktivní firmy ve čtyřech státech za tři roky.

DATA obrat;
  INPUT stat $ rok obrat;
  DATALINES;
MI 1996 1211
MI 1997 1045
MI 1998 1829
OH 1996  781
OH 1997  654
OH 1998 1098
WI 1996 2319
WI 1997 1890
WI 1998 1200
VA 1997 1000
;
RUN;

Nyní zobrazíme histogram obratu a rozdělíme jej podle státu. Sloupce histogramu budou představovat roky a na svislé ose bude celkový obrat.

AXIS1 LENGTH = 10
      ORIGIN=(3, 5) WIDTH=1
      ORDER =(1996, 1997, 1998)
      OFFSET=(2, 2)
      VALUE=(C=black F=centb H=0.5)
      LABEL=(C=black H=0.5 F=centb 'Rok');
AXIS2 LENGTH = 10
      ORIGIN=(3, 5) WIDTH=1
      OFFSET=(0, 0.5)
      VALUE=(C=black F=centb H=0.5)
      MAJOR=(C=black H=0.2 W=2)
      MINOR=(C=black H=0.1 W=1 N=1)
      LABEL=(C=black H=0.5 F=centb A=90 'Obrat (tis. USD)');
LEGEND2 ACROSS=1
        FRAME POSITION=(bottom center outside)
        MODE = share
        VALUE =(F=centb H=0.4 C=black 'Michigan'
                                      'Ohio'
                                      'Virginia'
                                      'Wisconsin')
        LABEL =(F=centb H=0.5 C=black 'State:');
PROC GCHART DATA=obrat;
   VBAR rok / DISCRETE
              WIDTH=7
              RAXIS=axis2
              MAXIS=axis1
              SUMVAR=obrat
              SUBGROUP=stat
              LEGEND=legend2;
RUN; QUIT;

Přepínač DISCRETE deklaruje ROK jako diskrétní veličinu. WIDTH=7 nastavuje šířku sloupců. SUMVAR= definuje veličinu, jejíž kumulativní hodnoty se budou zobrazovat na svislé ose namísto četností. SUBGROUP= rozděluje sloupce histogramu na skupiny. Zde je žádaný obrázek.

Nelíbí-li se nám barvy a šrafování grafu, můžeme je pozměnit příkazem PATTERNn. Definujeme

PATTERN1 C=black VALUE=s;  /* vyčerněný (solid)            */
PATTERN2 C=black VALUE=e;  /* prázdný (empty)              */
PATTERN3 C=black VALUE=l1; /* šrafovaný doleva, hustota 1  */
PATTERN4 C=black VALUE=r3; /* šrafovaný doprava, hustota 3 */

Nyní stačí spustit stejnou proceduru GCHART jako předtím a SAS bude automaticky střídat druhy šrafování definované v příkazech PATTERN1 až PATTERN4. Hleďme.

5. Kreslení více grafů na stránku

Abychom umístili více grafů na jednu stránku, musíme jednotlivé grafy nejprve vytvořit a uschovat v grafickém katalogu. Založení a udržování grafického katalogu má na starosti procedura GREPLAY. Pomocí této procedury pak definujeme, kolik grafů se má umístit na jednu stránku a kam. Nakonec grafy překopírujeme.

Během vytváření grafů pro katalog můžeme vypnout jejich zobrazování na obrazovku příkazem GOPTIONS NODISPLAY; a přepnout zpátky těsně před kopírováním grafů na výslednou stránku.

V průběhu práce se SASem je automaticky v pracovním direktoráři vytvořen grafický katalog GSEG, do něhož se ukládají všechny vytvářené grafy. Chceme-li si nadto vytvořit vlastní katalog GRK, zadáme příkaz

PROC GREPLAY GOUT=grk NOFS; QUIT;

Graf uschováme v katalogu GRK tím, že uvedeme argument GOUT= u procedury GPLOT nebo GCHART:

PROC GCHART DATA=obrat GOUT=grk;

Grafy jsou uvnitř katalogu označeny jménem procedury, která je vytvořila, a číslem. Například první graf vytvořený procedurou GPLOT je nazván GPLOT, druhý je GPLOT1, třetí GPLOT2 atd. Podobné je to u grafů vytvořených procedurou GCHART. Pomocí těchto jmen můžeme přistupovat k jednotlivým grafům uschovaným v grafickém katalogu.

Zde si ukážeme, jak zobrazit dva rozptylové diagramy a dva histogramy na jedné stránce. Můžeme použít již dříve vytvořené grafy, které jsou stále uložené v katalogu GSEG. Dejme tomu, že nás zajímají grafy GPLOT2, GPLOT5, GCHART2 a GCHART3 z katalogu GSEG. Spustíme tedy proceduru GREPLAY a zadáme ji GSEG jako vstupní katalog (IGOUT=GSEG). Potom zadefinujeme tzv. šablonu (template), tj. polohu čtyř segmentů pro umístění grafů na jednom panelu. Zadáme je pomocí souřadnic jejich rohů, např. LLX je x-ová souřadnice levého dolního rohu (Lower Left), URY je y-ová souřadnice pravého horního rohu (Upper Right). Pro každý segment tedy musíme zadat 8 čísel mezi 0 a 100 (jednotkou je procento délky celého panelu v příslušném směru). Zde je příklad:

PROC GREPLAY IGOUT=gseg TC=sablkat NOFS;
   TDEF ctyri DES='Ctyri obrazky na jedne strance'
      1/LLX=0   LLY=50 ULX=0  ULY=100 URX=50  URY=100  LRX=50  LRY=50
      2/LLX=50  LLY=50 ULX=50 ULY=100 URX=100 URY=100  LRX=100 LRY=50
      3/LLX=0   LLY=0  ULX=0  ULY=50  URX=50  URY=50   LRX=50  LRY=0
      4/LLX=50  LLY=0  ULX=50 ULY=50  URX=100 URY=50   LRX=100 LRY=0;
   TEMPLATE=ctyri;
   TREPLAY 1:Gplot2 2:Gplot5 3:Gchart2 4:Gchart3;
QUIT;

Není těžké uhodnout, že příkaz TDEF definuje šablonu nazvanou CTYRI. Ta se uschová do katalogu šablon SABLKAT, takže ji není nutné definovat znovu při dalším spuštění GREPLAY. Příkaz TEMPLATE=CTYRI říká, jaká šablona se má použít, a příkaz TREPLAY určuje grafy, které se mají umístit do jednotlivých segmentů. Celou nádheru si můžete prohlédnout zde.

Návrat na hlavní stránku