13 Ansprechende Graphiken in:

Andreas Behr, Ulrich Pötter

Einführung in die Statistik mit R, page 222 - 249

2. Edition 2010, ISBN print: 978-3-8006-3599-3, ISBN online: 978-3-8006-4878-8, https://doi.org/10.15358/9783800648788_222

Series: Vahlens Kurzlehrbücher

Bibliographic information
A G Wir haben bisher zwar schon viele Graphiken und entsprechende R Befehle kennengelernt. Aber wir haben vermieden, Details der Graphikbefehle zu diskutieren. Insbesondere in der täglichen Arbeit mit R aber kommt der Produktion von ansprechenden (und funktionierenden) Graphiken eine zentrale Bedeutung zu. Dabei sind viele Details zu beachten: Die Graphik sollte der Art der Verwendung entsprechen, man wird also zwischen Graphiken für Präsentationen und Graphiken für Artikel unterscheiden. Dann müssen Ausgabeformate zur Weiterverarbeitung, Größe der Graphiken, passende Fonts für die Beschriftung und deren Kodierung, Farben, Achsen und Achsenbeschriftungen etc. festgelegt werden. Wir stellen in diesem Kapitel die wichtigsten Möglichkeiten, die R bietet, zusammen. Im Unterschied zu den bisherigen Kapiteln konzentriert sich die Darstellung nicht auf statistische Aspekte, sondern folgt den technischen Anforderungen. Daher muss man nicht der Gliederung des Textes folgen, sondern kann die Abschnitte weitgehend unabhängig voneinander lesen oder sie als erste Orientierung in der täglichen Arbeit benutzen. 13.1 Die Elemente der Standardgraphik 13.1.1 Der Befehl plot() 13.1.2 Optionen des plot() Befehls 13.1.3 Stilparameter par() 13.1.4 Mathematische Annotation 13.1.5 Farben 13.1.6 Ausgabeformate und Devices 13.2 Sprachen, Encodings und Fonts 13.2.1 Sprachen und Encodings 13.2.2 Fonts . Die Elemente der Standardgraphik Bisher haben wir Befehle für die Erzeugung von Graphiken nicht genauer beschrieben. Wir haben uns darauf beschränkt, die Grundformen der Befehle Ansprechende Graphiken zu dokumentieren, sind aber nicht näher auf Optionen und Alternativen eingegangen. Die effektive Kommunikation von Ergebnissen statistischer Analysen erfordert aber auch die effektive Produktion ansprechender und informativer Graphiken. Die Voreinstellungen des Pakets graphics, mit dem auch die Mehrheit der Graphiken dieses Buches erstellt wurden, sind ein guter Kompromiss zwischen verschiedenen Erfordernissen. Sie sind aber sicher nicht gleichzeitig optimal für die tägliche Arbeit, eine Präsentation, einen Bericht oder eine Veröffentlichung. Man sollte daher die wesentlichen Elemente einer Graphik an den jeweiligen Kontext anpassen. Dazu sollte man sich einen Überblick über die wichtigsten Parameter verschaffen, mit denen das Aussehen einer Graphik beeinflusst werden kann. In der Standardgraphik von R gibt es eine große Vielfalt an Möglichkeiten, das Aussehen einer Graphik zu gestalten und zu verändern. Daher besprechen wir hier nur die aus unserer Sicht wichtigsten Elemente. Die Standardversion der Graphikerstellung beschreibt eine Graphik in zwei Schritten. Zunächst werden die Elemente einer Graphik zusammengestellt: Ein Koordinatensystem einschließlich entsprechender Achsen, die einzutragenden Punkte, Linien, Symbole, Legenden und Beschriftungen sowie deren relative Größen. Erst im zweiten Schritt wird die Ausgabe all dieser Elemente in ein entsprechendes Format (Bildschirm, Datei einer bestimmten Graphikbeschreibungssprache etc.) durchgeführt. Erst in diesem Schritt werden Angaben zur physischen Größe der Graphik, den zu verwendenden Schriftfonts und deren Größen, die Aufteilung auf möglicherweise mehrere logische Seiten und ähnliche Fragen relevant. Die diversen Voreinstellungen vermitteln einen anderen, möglicherweise irreführenden ersten Eindruck. Nach Spezifikation der Graphikelemente wird etwa nach dem plot() Befehl immer auch eine Bildschirmausgabe vorgegebener Größe etc. gestartet. Unter Windows-Betriebssystemen haben diese Fenster zudem ein Menü, das Ausgaben in unterschiedlichen Dateiformaten zu wählen erlaubt. Anfängern erscheint das oft so, als sei der erste Schritt der Graphikerstellung identisch mit der Produktion von Graphiken, auch solchen, die in andere Dokumente eingebunden werden sollen. Das ist nicht der Fall: Die mit den Voreinstellungen produzierten Graphiken reichen zwar sicher für die tägliche Arbeit mit der Ausgabe am Bildschirm, erzeugen aber erstens je nach Ausgabeformat sehr unterschiedliche Ergebnisse, die stark von den Möglichkeiten und Eigenschaften des Ausgabeformats abhängen. Und zweitens sind die Dateiausgaben, die über das Menü erzeugt werden, an die Vorgaben (etwa die Ausgabegrößen etc.) der Bildschirmausgabe gekoppelt. Würde man die so erzeugten Graphiken in Dokumente oder Präsentationen direkt einfügen, dann würde man gezwungen sein, deren Größen an die Dokumentvorgaben Paul Murrells Buch „R Graphics“ (Chapman & Hall, ) enthält sehr viele Details sowie einen ausführlichen Teil über die Komponenten eines zweiten Graphiksystems in R (Grid Graphics), das wir später nur sehr verkürzt vorstellen. . Die Elemente der Standardgraphik anzupassen. Diese nachträgliche Bearbeitung der Graphiken verzerrt aber wichtige Parameter wie das Verhältnis von Höhe zu Breite, die Fontgröße und viele andere wichtige Parameter wie Farben und Kontraste. Kaum etwas ist in Präsentationen störender als beliebig gestauchte Beschriftungen in verschiedenen Fonts oder unklare Größenverhältnisse. Es ist nicht empfehlenswert, die Ergebnisse eines plot() (oder boxplot() etc.) Befehls über das Menü des Graphikfensters direkt in Dokumente oder Präsentationen einzufügen. Man sollte immer die möglichen Parameter des Ausgabemediums, mindestens aber die Höhe und Breite sowie die Fontgröße explizit für das Ausgabemedium festlegen. Wir besprechen die notwendigen Angaben für einige der verschiedenen Ausgabeformate zwar erst in einem späteren Unterabschnitt. Nur muss schon hier für praktische Anwendungen betont werden, dass die zunächst beschriebenen Graphikelemente ganz unterschiedliche Ergebnisse in verschiedenen Ausgabeformaten erzeugen können. . . Der Befehl plot() Der grundlegende Befehl zur Erzeugung einer Graphik ist der plot() Befehl. Es ist eine generische Funktion, also ein Befehl, der je nach der Klasse des übergebenen ersten Elements entscheidet, wie die Graphik aufzubauen ist. Übergibt man die Koordinaten von Punkten in zwei Dimensionen, erhält man einen Scatterplot (oder linear interpolierte Linien der Punkte). Übergibt man einen Dichteschätzer, erhält man den Graphen der geschätzten Dichte (vgl. die Beispiele in Abschnitt . . ). Übergibt man das Ergebnis einer Regression, dann erhält man diagnostische Graphiken (vgl. die Beispiele in Abschnitt . . ). Der plot() Befehl erzeugt ein (zweidimensionales) Koordinatensystem. Dann werden entsprechende Achsen und deren Beschriftungen sowie Titel, Untertitel, Achsenbenennungen und die Aufteilung der Graphik in den eigentlichen Darstellungsbereich und die Annotationen (Titel, Achsenbeschriftung etc.) festgelegt. Technisch wird als erstes der Befehl plot.new() ausgeführt. Dieser Befehl erzeugt immer eine Bildschirmausgabe, ist also für den Eindruck verantwortlich, der plot() Befehl erzeuge direkt eine lesbare Graphik. Der Effekt des Befehls ist, dass entweder zunächst der Inhalt eines vorhandenen Graphikfensters gelöscht wird und dann in dieses Fenster gemalt wird oder dass ein Graphikfenster neu erstellt wird. Anschließend wird der plot.windows() Befehl aufgerufen, der für alle folgenden Operationen das Benutzerkoordinatensystem festlegt. Wird als erstes und zweites Argument des plot() Befehls ein Vektor übergeben (und haben die Vektoren gleiche Länge), dann werden sie als x bzw. y Koordinaten von Punkten in Benutzerkoordinaten interpretiert. Wird als erstes Argument eine Matrix oder ein Dataframe übergeben, werden die ersten beiden Spalten als Koordinaten interpretiert (ganz unabhängig von den Namen der Spalten). Man kann auch eine Liste mit zwei Elementen oder eine Formel Ansprechende Graphiken der Form yvar~xvar angeben. Wird nur ein x Vektor als erstes Argument angegeben und fehlt ein y Argument als zweites Argument, dann erhält man eine Graphik mit 1:n als x Achse. Die y Koordinaten werden aus dem ersten Argument gebildet. In all diesen Fällen wird als „Methode“ der Befehl plot.default() ausgeführt. In allen anderen Fällen entscheidet R auf Grund des Klassen-Attributs des ersten Arguments, welche spezielle plot-Funktion ausgeführt wird. Deswegen ergeben sich unterschiedliche Ergebnisse, wenn statt Vektoren oder Matrizen Dichte-Objekte oder Modelle übergeben werden. . . Optionen des plot() Befehls Optionen des plot() Befehls definieren oder verändern bestimmte weitere Aspekte einer Graphik. Die Optionen main="", sub="", xlab="", ylab="", geben die Beschriftungen der Graphikmit Titeln, Untertiteln und Benennungen der Achsen an. Grenzen des Darstellungsbereichs werden durch xlim=c(0,1) bzw. durch ylim=c(0,10) angegeben. Die Elemente der Werte (ein Vektor der Länge ) sind die unteren und oberen Grenzen des Darstellungsbereichs der Daten in Benutzerkoordinaten. Daten außerhalb dieses Bereichs werden nicht dargestellt. Im obigen Beispiel werden nur Punkte (oder Linien, Symbole, Legenden,. . . ) dargestellt, deren x-Koordinatenwerte zwischen und liegen und deren y-Koordinatenwerte zwischen und liegen. Daher sind die Optionen über die Grenzen der x bzw. y Achsen insbesondere dann wichtig, wenn später weitere Elemente zusätzlich zu den Argumenten des plot() Befehls hinzugefügt werden sollen (andereDaten, neue Funktionsverläufe, eine Legende, weitere Beschriftungen etc.). Denn nach einem ersten Aufruf der Funktion plot() ist der Darstellungsbereich für alle weiteren Elemente fest vorgegeben. Ob Punkte, Linien, beides oder Stufenfunktionen gezeichnet werden, wird im plot() Befehl durch die Option type="p" festgelegt ("p" wie points ist die Voreinstellung). Die wichtigsten Wahlmöglichkeiten sind "l" (linear interpolierte Linien der angegebenen Datenpunkte), "b" (Punkte und Linien), "o" (Punkte und Linien ohne zusätzliche Abstände), und "s" und "S" für zwei Versionen von Stufenfunktionen. Die Angabe "n" plottet nichts, es wird aber das Benutzerkoordinatensystem definiert. Wenn Linien gezeichnet werden sollen, dann gibt die Option lty=2 den Typ der Linien an (eine Liste der Möglichkeiten findet sich in der Hilfe des Pakets graphics unter demPunkt par). Die Linienbreite wird durch lwd angegeben. Die Form von Punkten wird durch den Parameter pch gewählt, dessen Varianten ebenfalls in der Hilfe zum Paket graphics unter dem Punkt points aufgeführt sind. Zusätzliche Graphikelemente Zusätzliche Elemente können durch Befehle wie lines(), points(), legend() zu einer Graphik hinzugefügt werden. In den Befehlen für Punkte und Linien . Die Elemente der Standardgraphik können ebenfalls die Optionen für Linienart, Punktsymbole und Linienbreite benutzt werden. Für eine Legende werden als die ersten beiden Argumente die Benutzerkoordinaten der linken oberen Ecke angegeben. Dann folgt der Text der Legende als Character-Vektor. Was vor diese Texte gesetzt wird, entscheidet sich an Hand der folgenden weiteren Elemente des Befehls. Wird etwa Ąll=c("blue","red") angegeben, dann erhält man entsprechend gefärbte Boxen vor dem Eintrag. Benutzt man etwa lwd=c(1,2,3), dann werden entsprechend breite Linien gesetzt, benutzt man lty=c(2,4,6), dann die entsprechenden Linientypen. Die Option pch=c(1,10,20) erzeugt die entsprechenden Symbole. Wichtig ist zudem, die Abstände zwischen den Zeichen in der x Richtung und insbesondere in die y Richtung beeinflussen zu können. Denn verschiedene Ausgabemedien oder Formate werden selbst bei gleicher Entwurfsgröße verschiedene Ergebnisse erzeugen. Das wird durch die Optionen x.intersp bzw. y.intersp bzw. erreicht. Wir demonstrieren die Effekte der Standardbefehle und Optionen in den zwei Graphiken in Abbildung . . Sie sind mit den folgenden Befehlen erzeugt worden: > set.seed(12) > x1 < rnorm(5);x2 < rnorm(5) > plot(x1,type="p",ylim=c( 3,3),bty="l",ylab="x",main="") > points(x2,pch=3) Für die zweite Graphik wurde lediglich hinzugefügt: > legend(2.8,3.2,c("1.Simulation","2.Simulation"),pch=c(1,3), + y.intersp=4,x.intersp=4,bty="n") Wir haben dabei im legend() Befehl noch die Option bty="n" benutzt, dessen Voreinstellung "o" einen Kasten um die Legende zeichnen würde. Im Plotbefehl selber bewirkt die bty Option "l" (kleines L) eine Linie an der unteren und linken Seite, die Voreinstellung "o" eine Linie an allen Seiten der Plotregion. Die Namen der anderen möglichen Optionen orientieren sich an der Form der entsprechenden Zeichen "7", "u","c" und "]". Der Wert "n" unterdrückt einrahmende Linien ganz. Neben Punkten und Linienzügen lassen sich die folgenden Elemente hinzufügen, die in der Plotregion gezeichnet werden: abline() Eine Gerade, die durch Steigung und Achsenabschnitt definiert wird. arrows() Die ersten vier Argumente geben die Startkoordinaten und die Zielkoordinaten an. Andere Optionen beeinflussen hauptsächlich die Form des Pfeilkopfes. grid() Ein Gitter, wobei nur die Anzahl der Einteilungen angegeben werden muss. polygon() Die ersten beiden Argumente geben die Vektoren der Koordinaten der Eckpunkte. Ein Polygon wird immer Ansprechende Graphiken geschlossen, indem das letzte Element der Koordinaten mit dem ersten Element verbunden wird. Daher kann man Polygone nutzen, um Bereiche zu färben. segments() Liniensegmente. Sie haben im Unterschied zu lines() eine Richtung, sind aber im Unterschied zu polygon() nicht geschlossen. symbols() Kreise, Quadrate, Rechtecke, Sterne,Thermometer oder Boxplots, denen sowohl Benutzerkoordinaten als auch verschiedene Formparameter übergeben werden können. text() Text. Das erste Argument (oder die ersten beiden Argumente) geben die Position in Nutzerkoordinaten an, dann folgt der Text (oder mehrere Texte) als Character- Vektor. In der Voreinstellung wird der Text an der Position des ersten Arguments zentriert. Die Optionen adj, pos und ofset erlauben verschiedene Variationen der Positionierung relativ zu den Koordinaten. Zudem kann man Annotationen außerhalb der Plotregion hinzufügen. Insbesondere kann man Achsen definieren, deren Beschriftung ändern oder Texte in die Marginalien der Graphik eintragen. Die letzte Aufgabe lässt sich problemlos mit dem Befehl mtext() umsetzen. Hinzufügen von Hinweisen zur Position von Punkten auf der x-Achse wird durch den Befehl rug() erleichtert. Änderungen der Achsen, Achsenbeschriftungen, Tickmarks etc. sind aber deutlich aufwendiger, wenn sie mehr als nur die Länge der Tickmarks, die Position der Tickmarkbeschriftungen und die Abstände der Beschriftungen von der Plotregion betreffen. Die letzteren Änderungsmöglichkeiten beschreiben wir im nächsten Abschnitt. Will man aber eigene Achsen definieren, Tickmarks, Tickmarkbeschriftungen und Achsenbeschriftungen an anderen Stellen erzeugen oder eine weitere Achse in anderen Maßeinheiten hinzufügen, dann muss man im plot() Befehl zunächst mit der Option axes=F die automatische Erzeugung von Achsen unterdrücken. Neue Achsen erhält man dann mit dem axis() Befehl. Das erste Argument gibt die Seite der Plotregion an, für die eine Achse gezeichnet werden soll. Die Angabe erfolgt durch Nummern im Uhrzeigersinn um die Plotregion: steht für den unteren Rand der Plotregion, für den linken, für den oberen, für den rechten Rand (die gleiche Konvention wird bei der Platzierung von anderen Marginalien benutzt). Will man also zwei Achsen (für die x- und y-Achse) produzieren, dann müssen zwei Aufrufe des axis() Befehls benutzt werden. Als zweites Argument können (optional) die Stellen für Tickmarks angegeben werden (in Benutzerkoordinaten). Man kann sowohl die Bezeichnungen der Tickmarks wählen als auch die Position der Achsen im Verhältnis zur Plotregion ändern. All diese Angaben Man kann auch wahlweise nur eine der Achsen unterdrücken. Die entsprechenden Optionen sind xaxt bzw. yaxt. Ist deren Wert "n", wird die entsprechende Achse nicht ausgegeben. . Die Elemente der Standardgraphik (a) (b) Abbildung 13.1: Einfache Graphikelemente: a) Punkte und Achsenbeschriftung, b) zusätzliche Legende. sind aber optional, die Voreinstellungen der Wahl der Tickmarks ist i.d.R. zufriedenstellend, die Bezeichnungen und deren Beschriftungen hängen aber stark vom Ausgabemedium, der am Schluss gewählten Ausgabegröße und den gewählten Fonts ab. Deswegen müssen hier manchmal Änderungen vorgenommen werden. Für Veröffentlichungen muss man dann oft tatsächlich die verschiedenen Kombinationen von Optionen des axis() Befehls ausprobieren. Für Präsentationen, Poster etc. reicht es aber oft auch, die relativen Größen der Beschriftungen mit den cex Angaben, die im nächsten Abschnitt beschrieben werden, leicht zu ändern, um durchaus befriedigende Ergebnisse zu erzielen. . . Stilparameter par() Wenn Sie die Befehle des Beispiels im letzten Abschnitt auf ihrem Rechner einfach kopieren, werden Sie recht unterschiedliche Ergebnissen zu den beiden Abbildungen . erhalten. Das liegt zum einen an den vielen zusätzlichen Möglichkeiten, die Form von Graphiken zu ändern. Zudem aber auch an den Übersetzungen der ursprünglichen Beschreibung der Graphik in verschiedene Graphikformate. Die wesentlichen Elemente wie Linienbreite, Art von Symbolen, Beschriftungen, Fonts, Tickmarkgrößen, Abstände zwischen Beschriftungen und Symbolen sowie die relative Größe der Elemente lassen sich nicht nur durch die entsprechenden Angaben in den Befehlen ändern, die einzelne Elemente zu einer Graphik hinzufügen. Zudem sind einige Gestaltungselemente wie die Platzierung der Achsen, die Lage der Tickmarks auf den Achsen und die Wahl der Abstände zwischen Beschriftungen sowie die Aufteilung zwischen Plotregion und Marginalien mit bestimmten Werten vorbelegt. Man erhält eine (relativ knappe, aber vollständige) Zusammenfassung dieser Voreinstellungen durch den Aufruf von par(). Einzelne Optionswerte können durch par("Optionsname") abgefragt werden. Ansprechende Graphiken Entsprechend kann man alle Werte dieser Voreinstellungen durch einen Aufruf der Form par(option=wert) ändern. Die Änderungen gelten ab der Stelle des Aufrufs von par(). Es gibt aber keine Möglichkeit, die Voreinstellung automatisch wiederherzustellen. Das ist bei der Vielzahl der Optionen und deren unterschiedlichen Auswirkungen bei verschiedenen Formaten gerade für Anfänger sehr verwirrend, weil das Experimentieren mit verschiedenen Kombinationen der Optionen durch frühere Einstellungen beeinflusst wird. Man kann sich behelfen, indem man als einen der ersten Befehle im Arbeitsskript die Standardparameter in einer Variablen speichert, etwa durch origpar < par(). Man erhält dann die ursprünglichen Größen durch par(origpar) zurück. Aufteilung der Graphikregion Die wichtigstenOptionen des par() Befehls betreffen zunächst die Aufteilung der gesamten zur Verfügung stehenden Fläche eines Graphikmediums in ein oder mehrere Teilflächen für die Ergebnisse von (mehreren) plot() Aufrufen. Damit kann man erreichen, dass mehrere Graphiken in einer Ausgabedatei (oder dem Bildschirm) arrangiert werden. Die beiden par() Optionen mfrow und mfcol teilen die Fläche zeilen- oder spaltenweise in gleich große Teile, in die dann die Ergebnisse von plot()Aufrufen in der entsprechenden Reihenfolge (Zeilen- oder Spaltenorientiert) eingetragen werden. Die Werte der Optionen sind Vektoren der Länge , die die Anzahl der Zeilen und Spalten (und damit die Gesamtzahl der Graphiken) festlegen. Der Unterschied zwischen beiden Optionen ist die Reihenfolge, in der die erzeugte Aufteilung der Graphikfläche gefüllt wird. Es gibt drei Alternativen, noch flexibler Aufteilungen zu erzeugen. Dies sind keine Optionen des par() Befehls, sondern eigenständige Befehle: layout(), lcm() oder split.screen() (alle drei sind inkompatibel mit den Optionen mfrow oder mfcol). I.d.R. benutzt man die Möglichkeit, mehrere plot() Aufrufe in einem Fenster oder einer Graphikdatei unterzubringen nur für spezielle Aufgaben, etwa wenn man für einen Teil eines Dataframes die Matrix der Scatterplots jeder Variablen gegen jede andere darstellen möchte. Dann sollten natürlich die für die einzelnenGraphiken verwandten plot() Funktionen in ihren formalen Parametern identisch sein. Will man dagegen Graphiken für einen Vortrag oder eine Veröffentlichung kombinieren, ist es fast immer vorteilhafter, einzelne Graphiken in R zu produzieren und die Kombination der Graphiken dem Text- oder Präsentationsprogramm zu überlassen. Man muss bei der Verwendung von mehr als zweizeiligen Anordnungen beachten, dass dann in der Voreinstellung Annotationen kleiner gesetzt werden. Man kann die entsprechenden Größen durch die weiter unten beschriebenen Optionen cex, cex.main etc. verändern. Das kannmanmit der pairs() Funktion erreichen. Der Code dieser Funktion liefert auch ein Beispiel für etwas komplexere Verwendungsmöglichkeiten des par() Befehls. Da pairs() generisch ist und zudem zum Namespace des Pakets graphics gehört, muss man graphics::pairs.default angeben, um das Quellprogramm zu sehen. . Die Elemente der Standardgraphik Als nächstes gibt es Optionen, die die Aufteilung der Graphikregion in einen äußeren Rand, den Platz für Marginalien und die Plotregion beeinflussen. Die Sprechweise in der R-Dokumentation ist „device region“ für die gesamte Fläche einer Graphik, „outer margin“ für den äußeren Rand, „figure region“ für die Vereinigung der Plotregion(en) und der Fläche(n) für Marginalien. Die Plotregion ist natürlich „plot region“. Die Ausgangsgröße der Graphikregion der Bildschirmausgabe wird auf Windows-Betriebssystemen durch windows(height=7,width=7) angegeben. Dabei sind die Größenangaben in inch, also . cm. Man kann die Größe durch par("pin") abfragen. Der Parameter Ąn gibt die Größe der Graphik ohne die äußeren Ränder in inch, in der Form c(Breite,Hoehe) an. Die Option Ąg leistet das gleiche, die Angabe erfolgt aber durch den Anteil an der gesamten Graphikfläche (ein Vektor der Länge vier für den unteren Rand, den linken, den oberen und den rechten Rand). Beide Angaben werden eher selten genutzt. In der Praxis ist es oft einfacher, die Größen von äußerem Rand und den Platz für Marginalien festzulegen. Bei fast allen Graphiken, die man für Texte oder Präsentationen benutzen möchte, dient der äußere Rand nur dazu, zusätzlichen Abstand zwischen umgebende Elemente und der Graphik zu erzeugen. Das ist aber eine Aufgabe des Textverarbeitungsprogramms und sollte nicht durch Graphikparameter beeinflusst werden. Die Größen der äußeren Ränder werden durch die drei Optionen oma, omi, omd beeinflusst. Die erste Variante gibt die Größe der Ränder in Linien in der gegenwärtigen Schriftgröße an, erfordert also eine Angabe wie par(oma=c(0,0,0,0)), um alle äußeren Ränder auf eine Breite von zu setzen. omi ist die entsprechende Version, in der inches als Einheit benutzt werden. Und omd benutzt Anteile an der Gesamtgröße der Graphik. Es ist vermutlich in fast allen Anwendungsbereichen sicher, einen dieser Parameter auf den Null-Vektor c(0,0,0,0) zu setzen. Das ist auch die Voreinstellung, die in den meisten (aber eben nicht allen) Befehlen benutzt wird, die auf dem plot() Befehl aufbauen. Wichtiger sind die Befehle, die die Größe der Plotregion bzw. äquivalent die der Marginalienbereiche ändern. Man kann entweder durch die Option plt die Anteile der Plotregion an der Region von Marginalien zusammen mit der Plotregion angeben. Häufiger wird man aber die Optionen mai oder mar benutzen, die die Größe der Marginalienbereiche für alle vier Seiten entweder in inch (mai) oder in Zeilen Text (mar) festlegt. Denn während plt für eine korrekte Skalierung in verschieden großen Ausgabemedien sorgt, möchte man in den meisten Fällen den Platz der Marginalien für Achsenbeschriftungen, die Achsen und deren Tickmarks etc. nicht im gleichen Maß wie die gesamte Graphik skalieren, sondern in allen benötigten Graphikgrößen die Lesbarkeit der Marginalien sicherstellen. Auf Linux-Systemen benutzt man entsprechend x11(width=7,height=7). Die Befehle sollten also nicht in Programmen verwandt werden, die von mehreren Personen mit unterschiedlichen Betriebssystemen benutzt werden sollen. Das gilt generell für alle Befehle, die die Bildschirmausgabe manipulieren. Ansprechende Graphiken Lage der Beschriftungen Die Lage von Titel und Achsenbeschriftung, der Tickmarkbeschriftungen und der Achsen wird durch die Option mgp bestimmt. Der Vektor der Länge drei gibt die drei Positionen in den Marginalien in Zeilen an. Daher bietet es sich an, auch die Größe der Marginalienbereiche in Zeilen zu wählen, also besser mar an Stelle von mai zu benutzen. Zwei Beispiele für mögliche Wahlen sind in Abbildung . wiedergegeben. Das erste benutzt einen äußeren Rand von einer Zeilenbreite an allen Rändern, Achsenbezeichnungen und Achsen an den Voreinstellungen. Das zweite Beispiel unterdrückt die Ränder, minimiert die Breite der Marginalien und setzt die Achsenbeschriftungen und die Beschriftungen der Tickmarks näher an die Plotregion. (a) (b) Abbildung 13.2: UnterschiedlicheWahlen für äußere Ränder undMarginaliengrö- ße sowie Abstände von der Plotregion bei gleichen Graphikgrößen. a) Zusätzlicher äußeren Rand von je einer Zeile an allen Seiten sowie die Voreinstellungen von mgp. b) Keine äußeren Ränder und engere Achsenbeschriftung sowie kleinerer Abstand der Tickmarkbeschriftungen. > par(mar=c(4,4,3,2),mfrow=c(1,1),mgp=c(3,1,0),oma=c(1,1,1,1)) > plot(x1,type="n",ylim=c( 3,3),ylab="y Name",xlab="x Name", + main="Titel") > par(mar=c(3,2,2,0),mfrow=c(1,1),mgp=c(1,0.2,0),oma=c(0,0,0,0)) > plot(x1,type="n",ylim=c( 3,3),ylab="y Name",xlab="x Name", + main="Titel") Größe der Beschriftungen Die nächste Gruppe von Optionen betrifft die Größenverhältnisse der verschiedenen möglichen Annotationen, also Titel, Achsenbeschriftungen und Achsen. Der allgemeine Faktor, der gleichzeitig alle Größenangaben um einen Faktor verändert, ist cex. Will man selektiv nur einzelne Größen . Die Elemente der Standardgraphik verändern, stehen cex.main (für Titel), cex.sub (für Untertitel), cex.lab (für Achsenbeschriftungen) und cex.axis für die Achsen selber zur Verfügung. Nun sollte man die Schriftgrößen nur in seltenen Fällen durch cex ändern. Denn zumindest in Publikationen sollten alle Beschriftungen eine einheitliche Größe haben und weder in Größe noch Font stark vom Text abweichen. In Präsentationen kann man etwas großzügiger verfahren, aber auch hier würden starke Unterschiede in den Beschriftungsgrößen eher störend wirken. Auf der anderen Seite kann man oft durch relativ kleine Änderungen der Tickmarkbeschriftungen eine bessere Aufteilung erreichen, ohne gezwungen zu sein, selbst eine Achsenbeschriftung angeben zu müssen. Die Größenwahl einzelner Plotelemente wie Punkte sollte in den entsprechenden Befehlen wie points() geschehen. Dabei sollte man gleich die erwartete Größe des endgültig verwandten Mediums benutzen. Nachträgliches Vergrößern oder Verkleinern kann die Qualität der erzeugten Graphik nur beeinträchtigen. Die Ausrichtung der Tickmarkbeschriftung wird durch die Option las bestimmt. Der Wert (die Voreinstellung) setzt Tickmarkbeschriftungen parallel zu den Achsen. Die restlichen möglichen Werte setzen sie entweder immer horizontal ( ) oder senkrecht zu den Achsen ( ) oder immer vertikal ( ). Die Tickmarklänge kann man entweder mit tcl oder tck bestimmen. Man kann auch global Textstrings und einzelne Buchstaben rotieren (durch die Optionen srt bzw. crt). Aber dazu sollte man besser die entsprechenden Optionen der textzeichnenden Befehle wie text() oder mtext() benutzen. Gleiches gilt für die angebbaren Eigenschaften von Linien (Optionen lheight, ljoin, lmitre, lwd und lty), die besser imBefehl lines() statt global gesetzt werden sollten. Fontauswahl Es gibt noch zwei globale Fontauswahlbefehle. Die Option family setzt aber nur global, ob man eine serifen oder serifenlose Schrift oder eine Schrift fixer Breite als Grundschrift wählen möchte. Zudem kann ein Symbolfont gewählt werden. Die Wahl der tatsächlichen Fonts wird erst mit dem Ausgabemedium und den zugehörigen Befehlen durchgeführt. Gleiches gilt für die Option ps, durch die die Schriftgröße (in Punkten, also zumeist in / je inch) festgelegt wird. Die endgültige Festlegung der Schriftgröße erfolgt erst bei der Angabe des entsprechenden Ausgabemedien. Die Angabe im par() Befehl beeinflusst nur die Berechnung von Stringlängen, die man häufig in den Texterzeugungsbefehlen auch direkt angeben kann. Die Option font mit Werten zwischen - wählt zwischen der Standardschrift ( ), der fetten Variante ( ), kursiv ( ), fett kursiv ( ) und dem Symbolfont ( ). Diese Angaben gibt es natürlich auch in den texterzeugenden Befehlen und sie sollten auch dort (und nicht global) verändert werden. Allerdings kann die Wahl des Fonts als Vorgabe im par() Befehl dazu benutzt werden, um die Auswahl an Symbolen Ansprechende Graphiken für Punkte fast beliebig zu erweitern. DieHilfe zum points() Befehl enthält im Abschnitt „Examples“ eine sehr hilfreiche Funktion, die die möglichen Symbole eines gegebenen Fonts auf einem gegebenen Rechner zumindest für den Bildschirm ausgibt. Das vorherige Beispiel der Hilfe zeigt auch, wie man dann die entsprechenden zusätzlichen Symbole ansprechen kann. Zudem kann man einige der spezielleren font Befehle wie font.main, font.sub, font.lab und font.axis dazu verwenden, die Beschriftungen einheitlich zu wählen. Darstellungsbereich Die Option xpd —die letzte Option, die wir hier besprechen wollen — beeinflusst den Bereich, in dem Ausgaben von Plotbefehlen wie points() überhaupt sichtbar sind. Die Voreinstellung (xpd=FALSE, die wir schon erwähnt haben), beschränkt den Bereich auf den Plotbereich. Alles mit Koordinaten außerhalb des Bereichs wird ignoriert. Falls xpd=TRUE, können alle Koordinaten der Plotregion und der Marginalien beschrieben werden und bei xpd=NA der gesamte Graphikbereich einschließlich der äusseren Ränder. . . Mathematische Annotation Oftmöchteman inAchsenbeschriftungen oder TextmathematischeNotation verwenden. Die Texterzeugungsbefehle unterstützen das mit einer eigenen Syntax. Diese Syntax wird natürlich nicht in den „normalen“ Character-Vektoren erkannt, denn deren Buchstaben werden ja, wenn überhaupt möglich, in die entsprechenden Zeichen/Buchstaben des Ausgabefonts übersetzt. Statt eines Character-Vektors übergibt man daher eine expression. Die Schreibweisen zur Erzeugung mathematischer Symbole ist grob an die LATEX Schreibweise angelehnt. Man erhält Super- und Subskripte durch x^2 bzw. x[3], griechische Buchstaben durch ihre Namen, also alpha, beta, Sigma etc. Die einfachen binären arithmetischen Operationen ebenso wie Vergleichsoperatoren können direkt wie x+y, a==b, c set.seed(123) > x < sort(rchisq(1000,10)) > par(mar=c(2.8,2.5,0.5,0.5)+0.1,mgp=c(1.2,0.5, 0.5), + tcl=c( 0.4),ps=10,las=1) > hist(x,nclass=20,main="",prob=T,xlim=c(0,30),ylim=c(0,0.12), + col="grey80",ylab="") > lines(density(x),lwd=1.5) > lines(x,dnorm(x,mean(x),sd(x)),lty=3,lwd=2) > mx < round(mean(x),2) > sx < round(sd(x),2) > legend(15,0.10,c("Kerndichtesch\"atzung","Normalverteilung"), + lty=c(1,3),lwd=c(1.5,2),bty="n") > text(24,0.05,expression(f(x)==frac(1,sigma∗sqrt(2∗pi)) + ~~ e^{frac( ~(x mu)^2,2∗sigma^2)}),cex=1.2) > text(18.9,0.074,bquote(mu==.(mx))) > text(21.9,0.074,bquote(sigma==.(sx))) Ansprechende Graphiken Die letzten beiden Zeilen demonstrieren die Möglichkeit, wie berechnete Werte in eine Graphik integriert werden können. x . . . . . . . Kerndichteschätzung Normalverteilung f (x) = σ π e (x µ) σ µ̂ = . σ̂ = . Abbildung 13.3: Graphik mit Annotationen . . Farben Bevor wir aber die tatsächliche Ausgabe der Graphiken besprechen, gehen wir noch auf die Angabe und die Wahl von Farben ein. Fast alle Graphikbefehle geben die Möglichkeit, die von ihnen erzeugten Graphikelemente zu färben. In der Regel heißt die entsprechende Option col. In manchen Befehlen, in denen unterschiedliche Graphikelemente gleichzeitig erzeugt werden, haben die Farboptionen abweichende Namen. So ist im legend() Befehl die col Option für die Farbe der Zeichen vor den Legendentexten reserviert. Die Farbe des Rahmens wird durch box.col, die des Textes durch text.col festgelegt. Farben können auf mehrere Weisen angegeben werden. Die einfachste Variante ist die Angabe eines Farbnamens. Einen Überblick über die definierten Farbnamen gibt der Befehl colors() (oder colours()), der einen Vektor der definierten Farbnamen zurückgibt. Die andere Möglichkeit besteht in der Angabe eines Punktes in einem Farbraum. Traditionell hat man das additive RGBModell benutzt, in demAnteile von Rot, Grün und Blau angegebenwerden. Die Angabe in R (etwa als Wert der col Option) erfolgt durch den Befehl rgb(), in dem die ersten drei Argumente die Anteile der drei Primärfarben sind. Als viertes Argument kann die Transparenz (der alpha Wert) angegeben werden. Ein weiteres Argument ist maxColorValue mit der Voreinstellung . Mit der Voreinstellung werden die ersten vier Argumente als Anteile interpretiert, also als Zahlen zwischen und . Eine häufig genutzte Alternative sind ganzzahlige Werte zwischen und . Dazu kann man maxColorValue=255 wählen. Dann werden die ersten vier Zahlen zunächst in ganze Zahlen transformiert und dann die entsprechenden Farbwerte konstruiert. Das ist etwas effizienter als die Voreinstellung, weil es den Farbmodellen der meisten Ausgabeformate entspricht. . Die Elemente der Standardgraphik Andere Farbräume werden ebenfalls unterstützt. Insbesondere können Farben imHSV-System (Hue, Saturation, Value) oder imHCL-System (Hue, Chroma, Luminance) angegeben werden. Insbesondere das letzte System entspricht weit besser der menschlichen Farbwahrnehmung als das an den Ausgabeformaten orientierte RGB-System. Die entsprechenden Befehle heißen hsv() bzw. hcl(). Etliche Beispiele in den Hilfeseiten der Funktionen (im Paket grDevices) zeigen die Unterschiede sowie Vor- und Nachteile der Farbräume. Farbpaletten Nun möchte man aber zumeist gar nicht einzelne Farben benennen. Vielmehr ist die Aufgabe oft, passende Farben für mehrere Linien zu finden, die deren Unterschiedlichkeit hervorheben. Oder für Kuchendiagramme Farben anzugeben, so dass benachbarte Farben „ähnlich“ sind. Diese Überlegungen führen zur Konstruktion von Paletten, einer bestimmten Anzahl von Farben, die entweder Unterschiede hervorheben oder Nähe entlang eines Kontinuums repräsentieren sollen. Die im Basispaket grDevices enthaltenen Paletten sind heat.colors(), topo.colors(), rainbow(), terrain.colors() und cm.colors().Das erste Argument dieser Funktionen ist immer die Anzahl der zu erzeugenden Farben. Im einfachsten Fall kann man zunächst eine Graphik erzeugen und dann etwa Linien mit den entsprechenden Farbangaben einfügen. Man würde also schreiben: > farbe < rainbow(4) > lines(x,y1,col=farbe[1]) > lines(x,y2,col=farbe[2]) Die beiden erzeugten Linien haben dann die ersten beiden Farben des Farbvektors farbe, der aus vier Werten der rainbow() Palette besteht. Alternative Farbpaletten Die Farbwahl dieser fünf Standardpaletten ist in vieler Hinsicht unbefriedigend. Die Standardpaletten sind einfach Schnitte durch den HSV-Farbraum. Sie berücksichtigen kaum solche Aspekte wie physiologische Unterscheidungsfähigkeiten (es gibt mindestens % farbenblinde Personen), Unterschiede der Farbdarstellung verschiedener Geräte (eine bestimmte Farbkombination lässt sich gut am Bildschirm erkennen, aber Projektionen oder Ausdrucke können gleichzeitig kaum erkennbare Farbkontraste zeigen) oder den Zweck der Farben (Hervorhebung von Unterschieden gegen Ähnlichkeiten entlang eines Kontinuums etc.). Daher gibt es mehrere Zusatzpakete, die bessere Eine gute Diskussion der wichtigsten Aspekte, die bei der Farbwahl berücksichtigt werden sollten, ist Achim Zeileis, Kurt Hornik und Paul Murrell: Escaping RGBland: Selecting colors for statistical graphics. Computational Statistics & Data Analysis, , , – . Ein Preprint ist unter der Adresse http://statmath.wu-wien.ac.at/~zeileis/papers/Zeileis+ Hornik+Murrell-2009.pdf erhältlich. Ansprechende Graphiken oder erweiterte Lösungen vorschlagen. Zu nennen sind insbesondere die Pakete RColorBrewer, colorRamps und colorspace. Die ersten beiden Pakete stellen im Vergleich zum Basispaket deutlich erweiterte Paletten zur Verfügung. In colorRamps sind das die Paletten blue2yellow(), cyan2yellow() und magenta2green(), die einen stetigen Übergang von „kalten“ zu „warmen“ Farben liefern. Einziges Argument der Befehle ist die Anzahl der zu erzeugenden Farben. Außerdem gibt es die Paletten blue2green, blue2red und green2red, die etwa in der Mitte der erzeugten Farben einen scharfen Bruch zwischen „kalten“ und „warmen“ Farben liefern und damit die mittleren Farbwerte hervorheben. Das Paket RColorBrewer ist noch etwas flexibler und stellt sequentielle Paletten, divergierende und qualitative Paletten zur Verfügung. Die sequentiellen Paletten sind zur Darstellung geordneter Werte geeignet, die divergierenden betonen Gegensätze und die qualitativen Paletten unterscheiden unterschiedliche Werte. Der Befehl ist brewer.pal(), dessen erstes Argument die Anzahl der Farben ist, das zweite Argument der Name der entsprechenden Palette. Eine Einschränkung ist die mögliche Anzahl von wählbaren Farben. Das Minimum ist immer , das Maximum liegt je nach Palette zwischen und . Der Befehl display.brewer.all() zeigt alle Paletten in einem Graphikfenster an. Am flexibelsten ist das Paket colorspace, in dem die verschiedenen Farbraum- Systeme als R-Klassen implementiert sind. Entsprechend gibt es Klassen, die die verschiedenen Systeme ineinander überführen können. Implementiert sind für das HCL-System Funktionen, die divergente Paletten (diverge_hcl()), sequentielle Paletten (sequential_hcl()) und drei Varianten heat_hcl(), terrain_hcl() sowie rainbow_hcl() bereitstellen. Als Argumente kann man jeweils neben der Anzahl der gewünschten Farben die Start- und Endpunkte eines Schnitts durch denHCL-Farbraum angeben. Zudem kann man gamma Werte angegeben. Und zusätzlich kann man die Form der Kurve durch den HCL-Farbraum wählen. Die Hilfe zu all diesen Befehlen enthält im Abschnitt Examples eine Funktion, mit der man Bildschirmdarstellungen der gewählten Paletten erzeugen kann. Welches System zur Wahl von Farben man auch wählt, es bleibt immer zu beachten, dass Farbangaben bei verschiedenen Ausgabemedien sehr unterschiedliche Effekte haben. Insbesondere haben Beamer sehr viel geringere Farbkontraste als LCD-Monitore. Farbdrucker haben i.d.R. einen begrenzteren Farbraum. Dagegen sind im Vierfarbdruck größere Farbräume darstellbar als sie durch RGB beschrieben werden können. Bereitet man also eine Präsentation Mit dem Paket dichromat kann man zudem den Effekt verschiedener Formen der Farbenblindheit ausprobieren. Der gamma Wert eines Ausgabegeräts (eines Bildschirms, eines Druckers, eines Projektors,. . . ) beschreibt die Beziehung zwischen Anteilen im RGB-Farbraum und den zur Darstellung auf dem Ausgabegerät notwendigen Anteilen. Der Wert beeinflusst Helligkeitsstufen. Unterschiede der Ausgabegeräte in den Farbkontrasten können dadurch nicht ausgeglichen werden. . Die Elemente der Standardgraphik mit Beamer vor, oder plant farbige Graphiken für Veröffentlichungen, dann sollte man die Ergebnisse der Farbwahl nicht nur am Monitor überprüfen, sondern auch auf dem geplanten Ausgabemedium. . . Ausgabeformate und Devices In Rs Standardgraphik ist die Konstruktion der Elemente einer Graphik von der Übersetzung in ein Ausgabeformat getrennt. Wir haben bisher nur die Erzeugung von Graphikelementen besprochen, nicht aber die Übersetzung in Bildschirmdarstellungen oder bestimmte Graphikformate. Dieser Schritt ist natürlich entscheidend für das Endprodukt. R stellt verschiedene „Devices“ zur Verfügung, um Ausgaben auf dem Bildschirm oder in verschiedenen Graphikformaten zu erzeugen und zu verwalten. Erst in diesem Schritt wird die endgültige Größe einer Graphik festgelegt, ebenso wie die tatsächlichen Fonts für Annotationen. Zu beachten ist, dass unabhängig von den Größenangaben der Ausgabegraphik die Fontgrößen von Texten erhalten bleiben. Das muss man natürlich bei Beschriftungen berücksichtigen. Man braucht ein solches Verhalten, um lesbare Annotationen in verschiedenen Ausgabeformaten zu gewährleisten. Nur entspricht dieses Verhalten nicht der Logik vieler Graphikbearbeitungsprogramme, in denen auch Beschriftungen entsprechend skaliert werden. Benutzt man überhaupt Annotationen wie Titel, Untertitel, Achsenbeschriftungen etc., dann wird man auch die Resultate für verschiedene Ausgabeformate überprüfen müssen. Denn die Angabe von Fontgrößen und Längen ist nicht einheitlich für alle Ausgabemedien. Für die praktische Arbeit heißt das, dass die Standardausgabe am Bildschirm nicht mit dem Endprodukt übereinstimmt. Man muss daher ein Programm benutzen, das das Resultat im endgültigen Ausgabemedium anzeigt. Deviceverwaltung Es gibt nun verschiedene Arbeitsweisen, um Graphiken in passenden Ausgabeformaten zu produzieren. Arbeitet man interaktiv, ist es wohl am Einfachsten, zunächst ein einziges Ausgabefenster auf dem Bildschirm zu erstellen. Das passiert ohne weitere Angaben automatisch mit jedem plot() Aufruf. Hat man ein ansprechendes Ergebnis erhalten, kopiert man esmit dem Befehl dev.copy() Manche Graphikprogramme, u.a. acroread, blockieren den Zugriff auf die eingelesene Datei. Die Folge ist, dass nach dem Aufruf von acroread für eine in R erzeugte Ausgabedatei im pdf Format interaktive Änderungen nicht mehr möglich sind. Es gibt aber etliche Graphikprogramme, die ihre dargestellten Dateien nicht blockieren. Für pdf und postscript Formate bietet sich ghostscript (http://www.ghostscript.com/) und gsview (http://pages.cs.wisc.edu/~ghost/gsview/index.htm) an. gsview ist ein GUI für ghostscript. Es dient zur schnellen Bildschirmdarstellung von pdf oder postscript Dateien. Ansprechende Graphiken im endgültigen Ausgabeformat in eine Datei und legt dabei Graphikgröße, Fontgröße und Fonts fest. Beim Kopieren wird ein neues Device im gewünschten Ausgabeformat geöffnet, das man anschließend wieder schließt. Der nächste plot() Aufruf löscht den Inhalt der gegenwärtigen Bildschirmausgabe, erstellt eine neue Graphik und man kann eine weitere Kopie im gewünschten Ausgabeformat erstellen. Bei diesem Vorgehen braucht man sich um die interne Behandlung von Devices in R kaum kümmern. Manchmal aber möchte man mehrere Bildschirmausgaben haben, etwa um Ergebnisse verschiedener Prozeduren in verschiedenen Graphiken zu erzeugen und sie dann am Bildschirm zu vergleichen. Oder man möchte in längeren Programmen (oder beim Rechnen auf entfernten Rechnern mit langsamen Verbindungen) die Bildschirmausgabe ganz unterdrücken. Zudem kann es sein, dass Fehler in längeren Programmen dazu führen, dass eine Vielzahl von Devices noch offen ist. In all diesen Fällen ist es hilfreich, ein wenig über die Verwaltung von Devices in R zu wissen. In jeder R Sitzung kann man mehrere (bis zu ) Devices öffnen und mit ihnen arbeiten. Es gibt immer ein NULL Device mit der Nummer , das nicht geschlossen werden kann. Zu jeder Zeit gibt es genau ein aktives Device, in dem der Output von Graphikbefehlen dargestellt wird. Eine Liste aller zur Zeit definierten Devices erhält man durch dev.list(). Der Befehl dev.cur() gibt die Nummer des aktiven Devices zurück. Devices kann man mit dev.of(Nummer des Devices) schließen. dev.set(Nummer des Devices) setzt die Nummer des aktiven Devices. dev.prev() und dev.next() wählen das vorhergehende bzw. das nachfolgende Device in der Liste der Devices (die Liste ist unter Ausschluss desNULLDevices zirkulär organisiert). graphics.of() schließt alle offenen Devices. Mit dev.new() kannman ein neues Device öffnen. Allerdings öffnen viele andere Befehle wie plot(), windows() oder die entsprechenden Befehle für bestimmte Ausgabeformate als Nebeneffekt ebenfalls neue Devices. I.d.R. wird man diese Befehle (und nicht dev.new()) nutzen, weil die Optionen der Ausgabeformate (und nur diese) direkt angegeben werden können. Zudem wird dann deren Konsistenz geprüft, was mit dev.new() nur indirekt erfolgt. Ausgabeformate Bei den Ausgabeformaten unterscheidet man zwischen Bildschirmausgaben, Raster- und Vektorgraphiken. Bildschirmausgaben hängen vom Betriebssystem ab. Auf MS-Windows-Systemen wird als Device-Typ windows() benutzt, auf Unix-Systemen x11()und auf MacOS quartz(). Alle diese Bildschirmausgaben erlauben die Wahl der Größe der Bildschirmausgabe und der Position auf dem Bildschirm. Man kann auch Fonts und Fontgrößen angeben, aber i.d.R. wird man dieseWahl erst bei der Angabe des Ausgabeformats (und dem zugehörigen Device) treffen wollen und die Bildschirmausgabe nur als Näherung der Graphik im Zielformat betrachten. . Die Elemente der Standardgraphik Rastergraphiken (etwa Graphiken in den Formaten bmp, png, jpeg etc., aber auch Containerformate wie tiff oder wmf (Windows Meta File)) speichern Graphiken als Matrizen von Farb- oder Grauwerten an einem Gitter von Stellen. Dabei geht natürlich jede Information über Schriften oder Linien verloren. Nur das Endergebnis, das Bild wird mehr oder weniger erhalten. Daher ist eine Weiterverarbeitung nur begrenzt möglich und anschließende Größenänderungen verändern auch die Schriftgrößen von Texten. Zudem ist es schwierig, gleichzeitig befriedigende Ergebnisse für Präsentationen und Publikationen zu erzeugen. Sie haben aber den Vorteil, von fast allen Präsentations- und Textverarbeitungsprogrammen verarbeitet werden zu können. Auch die meisten Browser können diese Bildformate wiedergeben. Zudem kann man sie relativ einfach zu Animationen kombinieren. Die entsprechenden Befehle bmp(),png(), jpeg() und tif() (und wmf() auf Windows-Betriebssystemen) öffnen ein neues Device und erzeugen eine Datei, deren Name als erstes Argument der Befehle angegeben werden kann. Die Voreinstellung des Dateinamens ist Rplotxxx.bmp (die Endung hängt vom Ausgabeformat ab). Dabei wird xxx durch die „Seitennummer“ der Graphik ersetzt und eine Datei dieses Namens im Arbeitsverzeichnis abgelegt. I.d.R. wird man sowohl den Namen als auch das Verzeichnis, in dem die Graphikdatei gespeichert werden soll, selbst wählen. Die weiteren Argumente dieser Befehle legen die Größe der Ausgabegraphik fest (height und width in Pixel). Für die Auflösung wird immer von dpi (dots per inch) ausgegangen. Die Fontgröße wird durch pointsize in in / inch, also big points, angegeben. Manche Rastergraphiken (bzw. Programme, die sie anzeigen), insbesondere png(), erfordern auch die Angabe einer Hintergrundfarbe durch die Option bg. Die Standardhintergrundfarbe wird sonst oft als schwarz interpretiert. Solange das Device geöffnet ist, ist die zugehörige Datei für andere Programme blockiert. Das Standardpaket grDevices stellt für Vektorgraphiken die Formate pdf und postscript zur Verfügung. Vektorgraphiken speichern die Bildinhalte in Nicht alle R Installationen unterstützen alle diese Ausgabeformate. Der Befehl capabilities() listet die Möglichkeiten einer Installation. Ist ghostscript installiert, dann kann man mit den Befehlen bitmap() bzw. dev2bitmap() eine ganze Reihe weiterer Rastergraphikformate erzeugen. Die Befehle erzeugen zunächst die Graphik als postscript bzw. pdf Datei und rufen dann ghostscript auf, um die Rastergraphik zu erzeugen. Neben der großen Anzahl an möglichen Rasterformaten ermöglicht der Ansatz, zumindest annähernd ähnliche Qualitäten bei unterschiedlichen Ausgabegrößen zu erhalten. Das freie Programm Imagemagick (www.imagemagick.org) ermöglicht ebenfalls die Übersetzung von verschiedenen Graphikformaten ineinander. Zudem sind diverse hilfreiche Transformationen möglich. Ist die Cairo-Bibliothek installiert, dann gibt es noch die Varianten cairo_pdf, cairo_ps und svg. svg (Scalar Vector Graphics) ist einW C Standard für die Verwendung vonVektorgraphiken im Internet. Allerdings muss die R-Installation die Verwendung von Cairo unterstützen bzw. mit der entsprechenden Option kompiliert sein. Beides ist in den meisten aktuellen Linux- Distributionen und deren R-Paketen der Fall, auf Windows-Betriebssystemen allerdings nicht. Alternativen für Windowsnutzer diskutieren wir etwas später. Ansprechende Graphiken einer Beschreibungssprache, die Fontinformationen, Punkte und Linienelemente geometrisch beschreiben. Sie können daher unterschiedlich skaliert werden, ohne an Qualität einzubüßen. Sie können auch deutlich einfacher durch Bildverarbeitungsprogramme verändert werden. Und sie erlauben eine einfachere Auswahl und Manipulation von Fonts. Sie sind daher als Ausgabeformate insbesondere für Präsentationen und Veröffentlichungen gegenüber Rastergraphiken vorzuziehen. Die entsprechenden Befehle heißen postscript() bzw. pdf(). Die Argumente sind ein Dateiname als erstes Argument (mit Voreinstellung Rplots.pdf, wenn nur eine Graphik erzeugt wird, bzw. Rplotxxx.pdf, falls mehrere Graphiken erzeugt werden.) Die Optionen height und width geben die (Device-) Größe in inch an, pointsize die Fontgröße. Die Optionen family und fonts regeln, welche Fonts tatsächlich in der Graphik verwandt werden. Beide Devices betten die Fonts aber nicht in die Graphik ein, sondern benutzen nur die entsprechenden Größeninformationen. Die Darstellung hängt daher von den installierten Fonts eines Rechners und den vom Betrachtungsprogramm vorgegebenen Ersatzfonts ab. Will man insbesondere bei Präsentationen nicht böse Überraschungen erleben, sollte man Fontinformationen immer in den Dateien speichern. Wie man Fontinformationen in den Ausgabedateien speichert und damit sicherstellt, dass die Ausgabe unabhängig von Rechnern und Graphikprogrammen ist, beschreiben wir etwas später in diesem Abschnitt. Sowohl postscript als auch pdf beschreiben den Inhalt einzelner Seiten. Daher kann man auch die Papiergröße wählen. Die Voreinstellung der Option paper ist "special", so dass die Angaben vonwidth und height als „Papiergröße“ benutzt werden. Für die Einbindung in Präsentationen oder Veröffentlichungen sollte diese Option gewählt werden. Für einzelne Graphiken kann man aber auch die Papiergrößen "a4", "letter", "legal" oder "executive" wählen und erhält dann eine Graphik, die auf dem entsprechenden Seitenformat plaziert wird. Die Voreinstellung von pagecentre ist TRUE, so dass die Graphik auf der entsprechenden Ausgabeseite zentriert ist. Bei Vektorgraphiken (die ja Seitenbeschreibungssprachen sind) kann man eine oder mehrere Graphiken in einer Datei speichern. Will man die Graphiken weiterverarbeiten, sollte man immer nur eine Graphik pro Datei speichern. Bei den Devices pdf und postscript kann man die Option oneĄle=F setzen. Dann wird pro Graphik nur eine Datei angelegt. Produziert man allerdings mehrere Graphiken und benutzt nur einen eindeutigen Namen für die Ausgabedatei zusammen mit dieser Option, dann wird nur die letzte Graphik tatsächlich gespeichert. Man kann die Namensangabe aber wie in der Voreinstellung schreiben, also Ąle="Dateiname%03d.pdf" benutzen, um mehrere Dateien mit automatisch durchnumerierten Namen zu erhalten. Diese Variante ist bei der Produktion von Animationen zu empfehlen. In allen anderen Fällen sollte ein eindeutiger Namen für jede Graphik gewählt werden. Setzt man in den Befehlen pdf() bzw. postscript() die Optionen oneĄle=F, paper="special", dann erhält man in beiden Formaten Dateien, die passende 7 10 35 83 _W iS o B eh r P öt te r 2A - B g 7 . Die Elemente der Standardgraphik Größenangaben („bounding boxes“) enthalten. Zudem sind am Schluss der Dateien alle möglicherweise veränderten pdf- oder postscript-Parameter (die internen Beschreibungsparameter von pdf bzw. postscript, nicht Rs Graphikparameter) wieder auf die Voreinstellungen zurückgesetzt. Die Dateien können daher problemlos in andere postscript- oder pdf-Dateien eingeschlossen werden. Arbeiten mit mehreren Devices Man kann nun in zwei Weisen vorgehen: Entweder man öffnet zunächst ein Zielausgabedevice, erzeugt die gewünschten Graphikelemente, schließt das Device anschließend (es ist sonst blockiert und man kann nicht mit anderen Programmen darauf zugreifen). Dann kann man sich das Ergebnis in einem entsprechenden Programm anzeigen lassen und die Schritte so lange wiederholen, bis das Ergebnis befriedigt. > pdf("../pics/test.pdf",width=5,height=4,oneĄle=F, + paper="special",pointsize=10) > coplot(lat~long|depth,data=quakes) > dev.of() Dieses Beispiel erzeugt eine pdf Datei mit dem Namen test.pdf im Verzeichnis pics parallel zum gegenwärtigen Arbeitsverzeichnis (das Verzeichnis muss existieren). Die Größe der Graphik ist inch inch und die Fontgröße big points. Genauer gesagt: Die Ausgangsgröße der benutzten Fonts wird festgelegt. Sie kann durch entsprechende cex Optionen in den Plot-Befehlen geändert werden. Die andere, und wohl häufiger benutzte Vorgehensweise produziert zunächst eine Bildschirmausgabe, ändert die Graphikbefehle, bis das Ergebnis befriedigt, und „kopiert“ dann das Ergebnis auf das Zielausgabedevice: > coplot(lat~long|depth,data=quakes) > dev.copy(pdf,Ąle="../pics/test2.pdf",width=5,height=4, + pointsize=10,oneĄle=F,paper="special") > dev.of() Das erste Argument von dev.copy() ist der Name eines Devices, dann folgen die weiteren Parameter wie in den Aufrufen der verschiedenen Devices. Das Wort „kopieren“, das auch in der Dokumentation von R benutzt wird, ist leicht irreführend. Denn in der Tat müssen bei anderen Wahlen der Ausgabegröße oder der pointsize von den Bildschirmgrößen Abstände, Achsenbeschriftungen, Tickmarks etc. neu berechnet werden. Ähnlichkeiten zwischen der Bildschirmausgabe und dem im Zielformat erzeugten Bild kann man nur dann erwarten, wenn man die Parameter der Bildschirmausgabe in etwa so wählt wie im Zielformat (mit expliziten Aufrufen von windows(), x11() oder quartz()). Das Eine mit diesen Optionen erzeugte postscript-Datei entspricht den Mindestanforderungen an eine encapsulated postscript-Datei (die oft mit der Endung eps versehen wird). OpenOffice und LATEX können solche Dateien (ebenso wie svg Dateien) direkt einbinden. 8 10 35 83 _W iS o B eh r P öt te r 2A - B g 8 Ansprechende Graphiken ist nicht nur umständlich, sondern nicht einmal besonders hilfreich, weil viele Aspekte des Zielformats in der Bildschirmausgabe gar nicht oder nur annähernd wiedergegeben werden können. Man kann sich daher nicht auf die Bildschirmausgabe allein verlassen, wenn man Graphiken konstruiert. Man muss sie immer mit einem entsprechenden Programm, das das Zielformat interpretiert, direkt kontrollieren. In die andere Richtung, bei der Angabe von Eigenschaften des Devices im Befehl dev.copy(), sollte man etwas mehr Arbeit investieren. Denn Angaben, die man in dem Befehl nicht macht, werden entweder aus den Voreinstellungen des Devices ergänzt oder aus den Einstellungen der Bildschirmausgabe kopiert. Letzteres kann natürlich zu Überraschungen führen, wenn man die Bidschirmausgabe zwischen zwei Sitzungen leicht ändert und dabei als Nebeneffekt andere Graphikergebnisse in einem Skript produziert. Daher sollte man möglichst alle Argumente eines Devices in einem dev.copy() Befehl aufführen. Das ist der einzige, aber wichtige Nachteil dieser Methode im Vergleich zur ersten, in der ja gar nichts „kopiert“ wird, also auch keine Voreinstellungen überschrieben werden können. . Sprachen, Encodings und Fonts . . Sprachen und Encodings Wir haben schon auf die Möglichkeiten mathematischer Annotation hingewiesen.Wie aber schreibtmanUmlaute undAkzente, gar ganze Beschreibungen in anderen Sprachen? Die Möglichkeiten hängen stark von der Kodierung von Fonts durch das Betriebssystem, den installierten Fonts und deren Kodierung ab. Die meisten neueren Linux-Distributionen kodieren Texte als UTF 8 (Unicode Transformation Format, das Symbole in - bytes ablegt). Sie können daher praktisch alle Symbole aller Sprachen sowie viele mathematische Zeichen darstellen. Auf neuen Windows-Betriebssystemen wird wird eine Variante von UTF 16 verwandt ( - Zeichen mit jeweils byte), aber oft werden in Deutschland noch die -bit Kodierungen Latin1 (auch als iso 8859 1 oder, in einer Variante mit deme-Symbol als iso 8859 15 bezeichnet) oder Microsofts Variante von Latin1, Codepage (cp1252, die neben dem e-Symbol einige weitere Zeichen zu Latin1 ergänzt) verwandt. Welches Kodierungssystem benutzt wird, kann man in R durch den Befehl l10n_info() abfragen. Das Ergebnis des Aufrufs gibt in drei logischen Variablen an, ob das System Kodierungen in mehreren Bytes unterstützt (MBCS) und ob entweder UTF 8 oder Latin1 benutzt wird. In UTF 8 Umgebungen kann man relativ leicht Texte verschiedener Sprachen und auch mathematische Formeln schreiben. Eine Gedichtzeile von Nâzım Hikmet im türkischen Original wäre etwa: > plot.new();plot.window(c(0,10),c(5,1)) > text(5,1,"Yaşamak bir aǧaç gibi tek ve hür ve bir orman gibi kardeşçesine . Sprachen, Encodings und Fonts + \n Nâzım Hikmet") Kann man die entsprechenden Buchstaben nicht über die Tastatur erzeugen oder im Editor wählen, kann man immer noch die entsprechenden UTF 8 Codes direkt angeben. Für unser Beispiel sind das \u00e2 für „â“, \u00e7 für „ç“, \u0131 für „ı“, u011f für „ǧ“ und \u015f für „ş“. Der text() Aufruf würde also so aussehen: > text(5,1,"Ya\u015famak bir a\u011fa\u00e7 gibi tek + ve h\u00fcr ve bir orman gibi karde\u015f\u00e7esine + \n N\u00e2z\u0131m Hikmet") Das ist aber hässlich und wenig übersichtlich. Zudem gibt es in UTF 8 Betriebssystemen zumindest für natürliche Sprachen einfachere Möglichkeiten der Eingabe. Für die mathematischen Symbole in UTF 8 allerdings ist man entweder auf diese Form der Eingabe angewiesen oder muss sich auf die Fähigkeiten seines Editors verlassen. Hier ist ein Beispiel: > text(1,4,"\u2200 \u03b5 > 0 \u2203 \u3b4 > 0: + \u2200 x,x\u2032 mit |x x\u2032| < + \u03b4 \u21d2 |f(x) f(x\u2032)| < \u03b5") ergibt є > δ > x, x mit x x < δ f (x) f (x ) < є Auf Windows-Betriebssystemen (oder Linux-Systemen, die nicht UTF 8 benutzen) mit einfacher -bit Kodierung von Zeichen muss man etwas mehr Aufwand treiben. Nehmen wir als Beispiel einXP Systemmit einer deutschen Sprachwahl. Der Befehl Sys.getlocale() zeigt einem die im Betriebssystem installierte bzw. die von R benutzte Konfiguration. Der Befehl l10n_info() fasst die Information zusammen. > Sys.getlocale("LC_CTYPE") [1] German_Germany.1252 > l10n_info() $MBCS [1] FALSE $ŠUTF 8Š [1] FALSE Eine Liste der wichtigsten UTF 8 Codes findet sich auf Paul Murells Seite http://www. stat.auckland.ac.nz/~paul/R/CM/AdobeSym.html. Auf die ersten UTF 8 Codes kann man zugreifen, wenn man encoding="PDFDoc" in den pdf() oder postscript() Devices wählt. Allerdings gehören die Zeichen „ı“, „İ, „ǧ“, „Ǧ“ sowie „ş“ und „Ş“ nicht dazu. Diese Variante kann man immer noch nicht durch pdf() etc. in eine Vektorgraphik verwandeln, weil pdf() die -bit Fontbelegung von Adobe mit anderer Belegung der Zeichen benutzt. Das Device cairo_pdf hilft hier weiter. Informationen über Codepages und Sprachdarstellungen für Windowssysteme findet man auf http:/msdn.microsoft.com/en-us/goglobal/default.aspx. Etwas übersichtlicher ist http:/www.i18nguy.com/unicode/codepages.html#msftwindows. Ansprechende Graphiken $ŠLatin 1Š [1] TRUE $codepage [1] 1252 Nun enthält die Codepage cp1252 aber weder ı noch ş oder ǧ oder deren große Varianten. Man kann den Text also in dieser Codepage gar nicht darstellen. Daher muss man zunächst die gerade benutzte Zuordnung von Codes zu Zeichen ändern. Microsofts Version für die türkische Sprache ist Codepage cp1254, eine Variante von iso 8859 9 (Latin9). Man kann sie aus R heraus durch Sys.setlocale(category="LC_CTYPE",locale="turkish") wählen. Am Schluss aber sollte man die Einstellung der „locale“ wieder zurücksetzen. Aber wie erzeugt man eine entsprechende Graphikdatei? Für die Bitmap- Formate gibt es kein Problem, weil sie die Fontinformationen nur indirekt benutzen. Aber postscript(), pdf() und svg() benutzen die Fontinformationen für ihre Textdarstellungen. Schreibt man also bevor man die locale zurücksetzt: > dev.copy(pdf,Ąle="test.pdf") > dev.of() dann sind in der erzeugten Datei die türkischen Schriftzeichen durch die entsprechenden Zeichen des Standardzeichensatzes ersetzt (oder durch Auslassungszeichen gekennzeichnet). Man kann in dem Befehl dev.copy() bzw. dem entsprechenden pdf() Befehl zwar die Option encoding="CP1254" setzen, aber man erhält eine Fehlermeldung, weil diese Codepage im Verzeichnis R_HOME/library/grDevices/enc nicht enthalten ist. Es gibt nur die Varianten cp1250 (Ost- und Mitteleuropäisch, eine Variante von iso 8859 2 bzw. Latin2), cp1251 (Kyrillisch, eine Variante von iso 8859 5), cp1252 (Westeuropäisch, eine Variante von iso 8859 15 bzw. Latin9), cp1253 (Griechisch, eine Variante von iso 8859 7) und cp1257 (baltisch, eine Variante von iso 8859 13 bzw. Latin7). Die Codepage für türkische Schriftzeichen, cp1254, fehlt also, ebenso die Variante Latin5. Da die Encodings fest vorgegeben sind, kann man auch nicht einfach eine entsprechende Codepage hinzufügen. Hier hilft aber das Paket Cairo weiter: > library(Cairo) Es können auch die großen asiatischen Sprachen (die als CJK-Sprachen zusammengefasst werden) dargestellt werden. Diese Fonts für Chinesisch in zwei Varianten, Japanisch ( Varianten) und Koreanisch ( Varianten) sind anders als die europäischen Sprachen in so genannten CID Formaten abgelegt. Auf arabische Schriftzeichen und viele Sprachvarianten kann man nur in UTF 8 Umgebungen zugreifen. AufWindows-Betriebssystemen benutzt das Paket für die Fonts diewindowsinternen Fontzuordnungen. Die benutzen aber seit Windows bzw. Windows XP intern nicht die eingeschränkte -bit Kodierung, sondern eine Variante von Unicode. Das Paket Cairo hilft also auf allen Windows-Betriebssystemen ab Windows XP. Dieses Paket und seine Devices beschreiben wir im nächsten Kapitel. Die Devices pdf() und postscript() dagegen sind auf Windows-Systemen an die -bit Restriktionen gebunden und müssen daher Codepages benutzen. . Sprachen, Encodings und Fonts > dev.copy(CairoPDF,Ąle="test.pdf",paper="special",width=5, + height=3.5);dev.of() > Sys.setlocale(category="LC_CTYPE",locale="german") . . Fonts Die Auswahl von Fonts ist aus mindestens vier Gründen wichtig: Text in Graphiken sollte mit den Fonts anderer Textelemente in Größe und Stil harmonieren, die Beschriftung von Graphiken in Präsentationen und Artikeln klar lesbar sein, die installierten Versionen der Fonts sollten zumindest die durch die Sprachwahl definierten Zeichen enthalten und die Fonts sollten in der erzeugten Graphikdatei eingebettet sein, um zu garantieren, dass das erzeugte Bild auf allen Rechnern zumindest ähnliche Ergebnisse liefert. Wir beginnen mit dem letzten Problem. Es ist natürlich sehr störend, wenn eine Graphik, auf die man viel Mühe verwandt hat, auf einer Konferenz im Ausland nur unleserliche Zeichen statt der erhofften Beschriftung anzeigt. Das passiert bei Vektorgraphiken, wenn die zu Hause benutzen Fonts nicht in die Datei übernommen werden. Denn dann interpretiert der Rechner auf der Konferenz die Verweise auf Zeichen in der Datei in seiner lokalen Sprache. Und mathematische Symbole können ganz verschwinden, weil die entsprechenden Fonts auf dem lokalen Rechner gar nicht installiert sind. Gleiches gilt natürlich, wenn man Artikel oder Bücher an Verlage schickt oder Diplomarbeiten drucken lässt: Sind auf den Rechnern der Verlage und Druckereien nicht alle verwandten Fonts installiert oder verwenden sie eine andere Sprachwahl, kann es zu sehr unangenehmen Überraschungen kommen. Man sollte daher immer alle Fonts in die erzeugten Dateien einbetten, eine Möglichkeit, die in allen Vektorgraphikformaten vorgesehen ist. Nun betten weder die Devices pdf noch postscript die Fonts aus Graphiken ein. Man kann aber den Befehl embedFonts() benutzen. Dazu muss ghostscript installiert sein. Sind die benutzten Fonts nicht in ghostscripts Suchpfad für Fonts, dann muss auch noch der Pfad zu den Fontsmit angegebenwerden. Tutman das nicht, dann wird ghostscript einen mehr oder weniger passenden Ersatzfont wählen. In dem Fall mag das Ergebnis ästhetisch unbefriedigend sein, aber zumindest werden alle Zeichen abgebildet. Eine Alternative sind die Devices cairo_pdf und cairo_ps, die immer versuchen, ihre Fonts einzubetten, manchmal aber auf Bitmapversionen zurückgreifen, wenn sie die Fontinformationen nicht finden oder benutzen können. Eine weitere Alternative bietet das Paket Cairo, dessen Devices auch immer alle Fonts einbetten. Die Auswahl der Graphikbeschriftungen sollte sich zumindest in Artikeln und Büchern an der Brotschrift des Textes orientieren. Dazu muss man eine Benutzt man eine neuere Version von acroread, dann kann man sich unter Datei -> Eigenschaften -> Fonts anzeigen lassen, welche Fonts eingebettet sind. Auf vielen Linux- Systemen gibt es auch das Konsolenprogramm pdffonts. Ansprechende Graphiken Übersetzung der Fontnamen in R in die entsprechenden pdf oder postscript Namen angeben. Für die Standardschriften, die in allen pdf Installationen und Druckern vorhanden sein sollten, gibt es fertige Übersetzungen. Das sind die Adobe-Fonts „AvantGarde“, „Bookman“, „Courier“, „Helvetica“, „Helvetica- Narrow“, „NewCenturySchoolbook“, „Palatino“ und „Times“ bzw. deren URW Versionen „URWGothic“, „URWBookman“, „NimbusMon“, „NimbusSan“ (für „URWHelvetica“), „NimbusSanCond“, „CenturySch“, „URWPalladio“ und „NimbusRom“ (für „URWTimes“). Eine weitere Möglichkeit ist für LATEX die Benutzung von „ComputerModern“, allerdings nur mit der klassischen Encoding, sowie die Verwendung der Hershey-Fonts, einer Sammlung von fast Zeichen (die europäischen Formate, Varianten der ostasiatischen Zeichen, mathematische, musikalische und weitere spezielle Zeichen) im Vektorformat mit spezieller Encoding. Die Voreinstellung wählt in den meisten Fällen als Serifen-Font „Times“, als serifenlose Schrift „Helvetica“ und als Font konstanter Breite „Courier“. Welche Schriften für eine Installation definiert sind, kann man durch names(pdfFonts()) bzw. names(postscriptFonts()) abfragen. !"#$ &'()$ *! !" !"#$ &'()$ *! !" !"#$ &'()$ *! !" Abbildung 13.4: Die Standardschriften Times, Helvetica und Courier. Alle vordefinierten Schriften kann man direkt in einem Befehl für ein passendes Device oder in plot-Befehlen mit den Optionen family bzw. fonts wählen. Die Grundschrift kann man für Devices allerdings nur für die pdf und postscript Devices wählen. Die Devices svg, cairo_ps oder cairo_pdf haben keine Optionen family oder fonts. Hier ist ein Beispiel mit mehreren Schriftarten in einer Graphik (was außerhalb typographischer Versuche sicher vermieden werden sollte): > par(mar=c(0,0,0,0),oma=c(0,0,0,0)) > plot.new();plot.window(c(0,10),c(3.5,1)) > text(5,1.3,"lorem ipsum dolor",family="Times") > text(5,2.3,"lorem ipsum dolor",family="Helvetica") > text(5,3.3,"lorem ipsum dolor",family="Courier") > dev.copy(pdf,Ąle="test.pdf",pointsize=11, + paper="special",width=1.7,height=0.85) > dev.of() Will man andere Fonts benutzen, dann muss man R die entsprechenden Fontinformationen mitteilen. Für die pdf- und postscript-Devices braucht man neben einer Abbildung der Fontnamen in R zu denen in postscript oder pdf auch Informationen über die Metriken der Schriften, also den Größenangaben für die einzelnen Buchstaben des Fonts. R (genauer: das Standardpaket grDevice) erlaubt die Definition einer Familie von Fonts (also der normalen, kursiven, fetten, fett kursiven und Symbol-Fonts), wenn sie als Type1 Fonts mit ihren . Sprachen, Encodings und Fonts metrischen Informationen abgelegt sind. Diese Informationen sind i.d.R. in Dateien mit der Endung afm abgelegt. Die heutigen LATEX Distributionen enthalten eine große Auswahl an freien Fonts (oder auch an entsprechenden Unterstützungsdateien für anderweitig verfügbare Fonts), für die in den meisten Fällen auch entsprechende Type1 Versionen und die zugehörigen afm Dateien bereitgestellt werden. Selbst wenn man nicht mit LATEX arbeitet, kann man sich aus den entsprechenden LATEX Distributionen passende oder zumindest sehr ähnliche Fonts besorgen. lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor Abbildung 13.5: Die vier Varianten der GFS-Bodoni-Schrift. Wir beschreiben ein Beispiel an Hand der GFS-Bodoni-Fonts. Die zugehörigen metrischen Informationen (die afm Dateien) sind im Installationsverzeichnis der MikTeX Distribution (und in fast allen anderen Distributionen) im Unterverzeichnis /fonts/afm/public/gfsbodoni abgelegt. Den Pfad zu diesen Dateien und die Namen der .afm Dateien für die Standardversionen normal, fett, kursiv und fett-kursiv (und optional für einen Symbolfont) muss man mit dem Befehl Type1Font() zu einem entsprechenden R Objekt zusammenfassen. Dann fügt der Befehl pdfFonts() die entsprechende Information in die Liste der verfügbaren Fonts ein. Der Name des neuen Fonts darf noch nicht in der Liste vorhanden sein. Die Liste der jeweils definierten Fonts erhält man durch einen Aufruf von pdfFonts() ohne weitere Argumente. Der Aufruf liefert alle R bekannten Eigenschaften der definierten Fonts. Es sollte also reichen, names(pdfFonts()) aufzurufen. Für unser Beispiel kann man schreiben: > Bodoni < Type1Font("Bodoni", + paste("/usr/share/texmf dist/fonts/afm/public/gfsbodoni/", + c("GFSBodoni Regular.afm","GFSBodoni Bold.afm", + "GFSBodoni Italic.afm","GFSBodoni BoldItalic.afm"), + sep="")) > pdfFonts(Bodoni=Bodoni) Die vier Standardvarianten der Schrift können wir nun ansprechen, Abbildung . zeigt das Ergebnis: > plot.new();plot.window(c(0,10),c(4.5,1)) > text(5,1.3,"lorem ipsum dolor",family="Bodoni",font=1) > text(5,2.3,"lorem ipsum dolor",family="Bodoni",font=2) > text(5,3.3,"lorem ipsum dolor",family="Bodoni",font=3) > text(5,4.3,"lorem ipsum dolor",family="Bodoni",font=4) Auch das ist mittlerweile eine Einschränkung, weil die meisten Fontformate heute entweder als TrueType oder als OpenType Versionen abgelegt werden. Manche Type -Fonts in LATEX-Distributionen enthalten nur die binären .pfb Dateien. Aus ihnen kann man die erforderlichem afm Dateien aber z.B. durch pf2afm (ein Teil von ghostscript) extrahieren. Ansprechende Graphiken > dev.copy(pdf,Ąle="test2.pdf",pointsize=11, + paper="special",width=1.7,height=0.85);dev.of() Natürlich muss man die Fonts für ein Dokument wie dieses Buch einbetten. Dazumuss ghostscript installiert sein, dann kannman embedFonts() aufrufen. Die Syntax ist: > embedFonts("test2.pdf",outĄle="test2a.pdf", + fontpaths="/usr/share/texmf dist/fonts/type1/public/gfsbodoni")

Chapter Preview

References

Zusammenfassung

Vorteile

- Einführung in die statistische Analyse mit R für Wirtschafts- und Sozialwissenschaftler

- Inklusive hilfreicher Tipps wie "Ansprechende Grafiken mit R gestalten"

Zum Thema

R ist ein Statistikprogramm, das kostenlos über das Internet verbreitet wird und dessen Source Codes frei zugänglich sind.

Aufgrund dieses kostenlosen Angebots gehen immer mehr Dozenten dazu über, neben SPSS auch R zu lehren bzw. SPSS durch R zu ersetzen.

In R steht dem Nutzer die gesamte Bandbreite statistischer Verfahren zur Verfügung. Durch die eigenständige Programmierumgebung ist die Software sehr flexibel und erlaubt notwendige Modifikationen und Erweiterungen verfügbarer Prozeduren.

Zum Werk

Dieses Buch führt leicht verständlich in die statistische Analyse mit R ein. Anhand von Beispielen wird die Umsetzung der wichtigsten Methoden der Statistik, wie sie üblicherweise in den Grundkursen gelehrt werden, mit R vorgestellt.

Das Buch verfolgt entsprechend zwei Ziele:

1. Vorstellung der statistischen Methoden,

2. Benutzung des Werkzeuges R zur Analyse von Daten.

Inhalt

- Grundlagen von R

- Datenbehandlung und graphische Darstellungen mit R

- Datenbeschreibungen (deskriptive Statistik)

- Wahrscheinlichkeitsverteilungen

- Regressionsanalysen

- Optimierungsverfahren

- Simulationen mit R

Neben vielen neuen, wirtschaftsorientierten Beispielen wird nun auch in die Paneldatenanalyse und Stichprobentheorie eingeführt.

Zu den Autoren

Dr. Andreas Behr ist wissenschaftlicher Mitarbeiter am Institut für Statistik und Ökonometrie der Universität Münster.

Dr. Ulrich Pötter ist wissenschaftlicher Mitarbeiter am Institut für Statistik der Universität Bochum.

Zielgruppe

Für Studierende und Dozenten der Wirtschaftswissenschaften im Bachelor an Universitäten und Fachhochschulen.