Farbangaben für SAS/Graph – leichtgemacht

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Grischa Pfister aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2010.

Farbangaben in SAS/GRAPH sind sehr einfach vorzunehmen, wenn bekannt ist, wie die wichtigsten Farb-Mischsysteme in SAS umgesetzt sind. Da dank des ODS auch hier immer mehr Farbe ins Spiel kommt, ist dieser Beitrag nicht nur für eingefleischte SAS/GRAPH-Fans interessant.

Farbangaben werden in SAS an verschiedenen Stellen benötigt, klassischerweise natürlich in SAS/GRAPH, seit Einführung des ODS wird aber auch die normale SAS-Ausgabe zunehmend bunter.

Im Falle der Grafiken werden Farbangaben unter anderen benötigt für Text, Linien, Symbole und Füllfarben. Dabei gilt es oft, Vorgaben von Kunden oder firmeninterne Stylesheets umzusetzen. Die Frage ist, wie die vorhandenen Angaben in SAS-Farbsyntax übersetzt werden können.

Zunächst einmal bietet SAS eine Reihe vordefinierter Farben an, zum Beispiel „red“, „green“, „blue“, die allerdings vor Version 9.2 nur in der Dokumentation zu finden war. Seit SAS-Version 9.2 wird in der SAS-Registry eine Liste mit den vordefinierten Farben gepflegt. Folgendes Programm zeigt die Liste an:

* GP Registrierte Farben *;
Proc Registry
  startat="COLORNAMES\HTML"
  list
 ;
Run;

Welche Farbe tatsächlich hinter so klingenden Namen wie „oldLace“, „PaleTurquoise“ oder „SaddleBrown“ steckt, lässt sich immer noch am besten durch Ausprobieren herausfinden.

Eine weitere Möglichkeit der Farbdefinition ist das SAS Color Naming Scheme (CNS), das eine Grundfarbe durch zusätzliche Angabe von Sättigung, Licht und eventuell einer zweiten Farbkomponente modifiziert. Die so entstehenden Farb-Namen werden entweder einfach zusammengeschrieben „darkGreyischGreen“, mit „_“ getrennt „light_vivid_purple“ oder durch Leerzeichen getrennt und in Anführungszeichen gesetzt: „medium strong red“.

In der Praxis findet sich allerdings vorrangig die Farbzusammenstellung mit Hilfe des RGB-Modells. Hier wird die Farbe durch Angabe von Rot-, Grün- und Blau-Komponenten gemischt. Dieses an sich einfache Modell wird in der Syntax aus zwei Gründen etwas erschwert. Zunächst erfolgen die Angaben im Wertebereich von 0 bis 255 statt in Prozent, dann muss die Angabe der Werte in Hexadezimal-Darstellung erfolgen. SAS erlaubt nämlich für den Namen einer RGB-Farbangabe genau acht Zeichen, die sich aus dem Marker „CX“, gefolgt von den Rot-, Grün- und Blauwerten zusammensetzen, also „CXrrggbb“, für Rot, Grün und Blau bleiben also jeweils zwei Stellen – deshalb die Darstellung in Hexadezimal. Die benötigten Werte können mit Hilfe des Wissenschaftlichen Taschenrechners von Windows genauso ermittelt werden, wie mit den üblichen Office-Programmen (zum Beispiel in Word: Schriftfarbe → Weitere Farben → Benutzerdefiniert) und natürlich im Kopf gerechnet werden. ;-)

SAS selbst bietet eine Reihe von Hilfsmakros an, die die Nutzung der verschiedenen Farb-Systeme erleichtern soll (neben den hier vorgestellten gibt es auch noch das HLSSystem). Diese Makros müssen vor der ersten Verwendung kompiliert werden, was durch Aufruf des Makros %Colormac erfolgt. Anschließend steht z.B. das Makro %RGB zur Verfügung, das als Parameter die Werte für Rot, Grün und Blau in Prozent erhält und dann eine entsprechende Farbangabe zurückliefert. Der Aufruf von:

%Colormac;
%Put farbe ist: %rgb(80,20,0), %rgb(0,80,20), %rgb(20,0,80);

zeigt im LOG das folgende Ergebnis:

…
*** Color Utility macros are now available ***
For further information on the Color Utility macros
enter:
   %HELPCLR(macroname) - Specific macro information
   %HELPCLR(ALL) - All macro information
   %HELPCLR - List of macro names
2 %Put farbe ist: %rgb(80,20,0), %rgb(0,80,20), %rgb(20,0,80);
farbe ist: CXCC3300, CX00CC33, CX3300C

Eine typische Verwendung im Pattern-Statement sieht dann so aus:

Pattern1 v=s c = %rgb(80,20,0);
Pattern2 v=s c = %rgb(0,80,20);
Pattern3 v=s c = %rgb(20,0,80);

Da Angaben in Prozent aber eher unüblich sind, sondern oft in den Vorgaben die „echten“ Werte von 0 bis 255 enthalten sind, lohnt es sich, ein eigenes Hilfsmakro zu schreiben, das diese Werte als Eingabe akzeptiert und dann wieder die passende Farbangabe zurückgibt. Ein solches Makro ist auch erstaunlich einfach zu schreiben, die numerischen Werte für Rot, Grün, Blau müssen lediglich mit dem Format HEX2. versehen werden und dann zu einer Zeichenkette zusammengesetzt werden. Da in der Makrosprache sowieso nur Text existiert, sieht das Hilfsmakro dann zum Beispiel so aus:

%Macro gpRgb(r,g,b);
  %Local color;
  %Let color = cx%Sysfunc(putn(&r,hex2.))%Sysfunc(putn(&g,hex2.))%Sysfunc(putn(&b,hex2.));
  &color
%Mend;

Wenn das Makro kompiliert wurde, lässt es sich genauso wie die SAS-Hilfsmakros verwenden:

Pattern1 v=s c = %gpRgb(165,210,170);
Pattern2 v=s c = %gpRgb(80,175,90);
Pattern3 v=s c = %gpRgb(55,115,60);