################################################################################ ### Seminar: Grafiken in R - ### ### Visualisierung kategorialer Daten ### ### Dokumentierter R-Code zum Vortrag vom 13.01.2011 ### ### Matthias Mittermayer ### ################################################################################ # Das Package vcd bietet Möglichkeiten, kategoriale Daten zu visualisieren. Im # Gegensatz zu einfachen Plots des Base-Packages (Bsp. Tortendiagramm, Balken- # diagramm) ist es durch die Verwendung von vcd möglich, nicht nur Häufigkeits- # verteilungen einzelner Variablen sondern auch Zusammenhänge, Interaktionen und # Abhängigkeiten von kategorialen Merkmalen zu visualisieren. # Package "vcd" einbinden library("vcd") # Datensatz einlesen daten <- read.csv("10-vcd-daten.csv", header = TRUE) ################################################################################ ### Variablenkodierung ### ################################################################################ # # gruendlich_untersucht: # Wurden Sie von Ihrem Arzt gründlich untersucht? # 1 = "Ich wurde nicht gründlich untersucht" # 2 = "Ich wurde zufriedenstellend untersucht" # 3 = "Ich wurde sehr gründlich untersucht" # # letzter_besuch: # Wie zufrieden waren Sie mit Ihrem letzten Arztbesuch? # 1 = "unzufrieden" # 2 = "neutral" # 3 = "zufrieden" # # geschlecht: # 1 = "Männlich" # 2 = "Weiblich" # # alter: # 1 = "18 bis 39 Jahre" # 2 = "40 bis 59 Jahre" # 3 = "60 +" # ################################################################################ # Variablen in kategoriale Variablen (Faktoren) umwandeln daten$gruendlich_untersucht <- factor(daten$gruendlich_untersucht, levels=c(1,2,3), labels=c("nein","neutral","ja")) daten$letzter_besuch <- factor(daten$letzter_besuch, levels=c(1,2,3), labels=c("unzufrieden", "neutral", "zufrieden")) daten$geschlecht <- factor(daten$geschlecht, levels=c(1,2), labels=c("m", "w")) daten$alter <- factor(daten$alter, levels=c(1,2,3), labels=c("18 bis 39", "40 bis 59", "60+")) ################################################################################ # Betrachte Summary der Daten und attach-Befehl summary(daten) attach(daten) ################################################################################ ### zu Kontingenztafeln ### ################################################################################ # Plotfuktionen des vcd Packages (z.B. mosaic(), sieve(), doubledecker()) # benötigen die zu betrachtenden Variablen in Form von Kontingenztafeln. # Im Folgenden wird hierfür der Befehl structable() verwendet. # Vor dem "Anlegen" von Kontingenztafeln sollte man bereits wissen, welche # Zusammenhänge man untersuchen möchte, da dies das spätere Aussehen der # enstprechenden Plots bestimmt. Hier wird beispielsweise bereits festgelegt, # in welcher Reihenfolge die Splits bei einem Mosaikplot erfolgen sollen. # Kontingenztafel 1 tab1 <- structable(letzter_besuch ~ gruendlich_untersucht) tab1 # Betrachte welche Auswirkungen es hat, wie sich ein Patient untersucht gefühlt # hat auf die Zufriedenheit mit dem letzten Arztbesuch ################################################################################ ### Beispiele für standardgrafiken ohne die Verwendung von vcd ### ################################################################################ # Balkendiagramm barplot(tab1, legend=TRUE, beside=TRUE, main="Gründlich untersucht vs. Zufriedenheit letzter Besuch", xlab="Zufriedenheit mit letztem Besuch", ylim=c(0,90)) # Mosaikplot zwischen Gründlich untersucht und der Zufriedenheit mosaicplot(tab1, main="Gründlich untersucht vs. Zufriedenheit letzter Besuch", ylab="Zufriedenheit mit letztem Besuch", xlab="Wurden Sie gründlich untersucht?") ################################################################################ ### Visualisierung von zweidimensionalen Kontingenztafeln ### ################################################################################ ################################################################################ ### Mosaikplot ### ################################################################################ # In vcd erstellt man einen Mosaikplot mit dem Befehl mosaic("Kontingenztafel") # Ein Mosaikplot visualisiert die beobachteten Häufigkeiten einer Kontingenztafel. # Man kann jedoch nicht die exakte Anzahl an Häufigkeiten ablesen, es handelt # sich nur um eine proportionale Darstellung. Multiplikation der Häufigkeiten # mit 10 würde das Aussehen des Plots nicht verändern. # Der Aufbau eines Mosaikplots: # Schritt 1: horizontaler Split nach "Gründlich untersucht" mosaic(tab1[,1]+ tab1[,2] + tab1[,3], split=TRUE, labeling_arg=list(set_labels=list(letzter_besuch=c("","","")), set_varnames=c(letzter_besuch=""))) # Diesen Plot nennt man Spine Plot. Er ist ähnlich einem Balkendiagramm, jedoch # spiegelt nicht die Höhe sondern die Breite die prozentualen Anteile der # Merkmalsausprägungen pro Level wieder --> Also: Betrachte Breite der x-Achse # hier: sehr wenig Patienten wurden nicht gründlich untersucht, deutlich mehr # hingegen neutral und nochmal mehr wurden gründlich untersucht # Schritt 2: zusätzlicher vertikaler Split nach "Letzter Besuch" mosaic(tab1, split=TRUE) # Interpretation des Mosaikplots: # 1. Verteilung von "Gründlich untersucht noch ersichtlich - diese Variable # dominiert den Plot # 2. Verteilung von "Letzter Besuch" gegeben einer Ausprägung von "Gründlich # untersucht" ebenfalls zu sehen # 3. Verteilung von "Letzter Besuch" nicht direkt ersichtlich ################################################################################ mosaic(tab1) mosaic(tab1, split=TRUE) mosaic(tab1, direction=c("v","h")) # Alle drei Mosaikplots splitten zuerst nach der Variablen gründlich untersucht. # Dies wird bereits durch die Kontingenztafeldefinition festgelegt. # Es findet lediglich einer Drehung um 90 Grad statt, falls man nicht wie # unter default (split=FALSE) erst mit einem vertikalen sondern einem # horizontalen Split beginnen möchte. # An der Interpretation ändert dies nichts. ################################################################################ # Kontingenztafel 2 tab2 <- structable(gruendlich_untersucht ~ letzter_besuch) tab2 mosaic(tab2, split=TRUE, margins=c(2.5,0.1,1.1,2.5)) # Hier wird zuerst nach der Variablen "Letzter Besuch" gesplittet, danach # nach "Gründlich untersucht" # Also dominiert die Variable "Letzter Besuch" den Plot - deren Verteilung ist # direkt ersichtlich. ################################################################################ # Änderung der Labels / Abstände etc. --> optische Anpassungen mosaic(tab1, split=TRUE, main="Gründlich untersucht vs. Zufriedenheit letzter Besuch", margins=c(4,1,2,1), labeling_arg=list(rot_label=c("left"=0), offset_labels=c("left"=0.5), offset_varnames=c("left"=1.5, "top"=0.5), set_labels=list(letzter_besuch=c("nein","mittel","ja")), set_varnames=c(letzter_besuch="Zufriedenheit mit letztem Besuch", gruendlich_untersucht="Wurden Sie gründlich untersucht?")) ) # margins=c() Breite der Ränder in der Reihenfolge # ("oben", "rechts", "unten", "rechts") # rot_label: bewirkt, dass die Labels von "Gründlich untersucht" horizontal # zu lesen sind # offset_labels : Verschiebung der Labels an der linken Seite # offset_varnames: Verschiebung der Variablennamen links und oben # set_labels: Umbenennung der Labels der Variablen "Letzter Besuch" # set_varnames: Umbenennung der Variablennamen ################################################################################ ### Fluctuationplot ### ################################################################################ # Für die Erstellung eines solchen Plots wird das Paket ggplot2 benötigt. # Der Fluctuationplot stellt die beobachteten Häufigkeiten einer Kontingenz- # tafel proportional dar. Im Moment ist dies in R nur für 2-dim. Kontingenz- # tafeln implementiert. # Fluctuationplots haben den Vorteil gegenüber Mosaikplots, dass die Flächen # quadratisch sind. So kann schneller ein Unterschied in der Größe erkannt werden. library("ggplot2") ggfluctuation(table(letzter_besuch, gruendlich_untersucht)) ################################################################################ ### Sieveplot ### ################################################################################ # Der Sieveplot stellt beobachtete und erwartete Häufigkeiten in einem Plot dar. # Die "großen" Flächen sind die unter Unabhängigkeit erwarteten Häufigkeiten. # Die "kleinen" Bereiche innerhalb der großen Flächen spiegeln die beobachteten # Häufigkeiten dar. Also kann Anhand der Dichte die Abweichung von beob. und # erwart. Häufigkeiten abgelesen werden. # sind "kleine" Bereiche "klein" --> zu viele beobachtete Häufigkeiten # sind "kleine" Bereiche "groß" --> zu wenig beobachtete Häufigkeiten sieve(tab1, split=TRUE, gp=gpar(lty="dotted"), labeling=labeling_values(value_type=c("observed"), gp_text=gpar(col="blue", cex=1.2))) # gp=gpar(lty="dotted"): Linien der beob. Häufigkeiten werden gepunktet an- # gezeigt. Hier können auch andere Argumente # wie col oder lwd angegeben werden # value_type=c("observed"): die erwarteten Häufigkeiten werden eingetragen. # Ebenfalls möglich: "expected", "residuals" # gp_text=gpar(col="blue", cex=1.2): Beob. Häufigkeiten in blau und Größe 1.2 # Es ist mit dem Auge schwer zu erkennen, ob die Flächen der beobachteten # Häufigkeiten "klein" oder "groß" sind, also ob zu viele oder zu wenig beob. # Häufigkeiten vorhanden sind, als man unter Unabhängigkeit erwarten würde. # Deshalb bietet es sich an, die Linien entsprechend farblich darzustellen. # Dies geschieht mittels gp=shading_sieve. sieve(tab1, split=TRUE, gp=shading_sieve, labeling=labeling_values(value_type=c("expected"), gp_text=gpar(cex=1.2))) # gp=shading_sieve: Linien in den Zellen werden entsprechend den # erwarteten und beobachteten Hfgkeiten eingetragen # beob Hfgkeiten > erwartete Hfgkeiten --> blau # beob Hfgkeiten < erwartete Hfgkeiten --> rot mosaic(tab1, split=TRUE, type="expected") # Will man nur die erwarteten Häufigkeiten betrachten ohne gleichzeitig einen # Zusammenhang mit den beobachteten Häufigkeiten darzustellen, kann man einfach # einen Mosaikplot erstellen und den type auf "expected" setzen. ################################################################################ ### Assoziationsplot ### ################################################################################ # Ein Assoziationsplot visualisiert direkt die Residuen, also Abweichungen von # beobachteten und erwarteten Häufigkeiten # # Interpretation: # Höhe einer Fläche: Pearson-Residuen # Breite einer Fläche: Wurzel der erwarteten Häufigkeiten # --> Fläche: proportional zu den Rohresiduen (beob. - erwart. Häufigkeiten) # # Assoziationsplots sind sehr gut geeignet, um erste Eindrücke über Abhängigkeit # der Variablen zu erhalten. Große Pearson Residuen( > 2, < -2) haben einen # großen Einfluss, dass die Nullhypothese (Unabhängigkeit der Variablen) bei # einem Chi-Quadrat-Unabhängigkeitstest abgelehnt wird. assoc(tab1, split=TRUE, labeling=labeling_values(value_type=c("residuals"), suppress=FALSE)) # value_type=c("residuals") zeichnet die Were der Pearson-Residuen in den Plot # suppress=FALSE stellt alle Rediduen dar (Standard: nur Residuen > 2, < -2) assoc(tab1, split=TRUE, labeling=labeling_cells(abbreviate_varnames=TRUE, clip=FALSE)) # labeling_cells: Schreibt Variablenname als auch Label in den ent- # sprechenden Bereich # abbreviate_varnames=TRUE die Variablennamen werden mit 1 Buchstaben abgekürzt # clip=FALSE die Beschriftung der Zellen kann über die Zelle # hinausgehen. DEFAULT: TRUE ################################################################################ ### Visualisierung von Kontingenztafeln höherer Ordnung ### ################################################################################ # Kontingenztafel 3 tab3 <- structable(letzter_besuch ~ geschlecht + gruendlich_untersucht) tab3 # Hier soll also untersucht werden inwieweit das Geschlecht und wie sich ein # Patient untersucht gefühlt hat Auswirkungen auf die Zufriedenheit hat ################################################################################ ### Mosaikplot ### ################################################################################ mosaic(tab3, split=TRUE, labeling_arg=list(offset_labels=c("bottom"=0.5), pos_varnames="right", rep=c(letzter_besuch=FALSE))) # pos_varnames="right": Variablennamen rechtsbündig # rep=c(letzter_besuch=FALSE) Labels der Merkmalsausprägungen der Variablen # letzter_besuch werden nur einmal in den Plot # geschrieben, nicht wiederholt # Interpretation: # Etwas mehr Frauen als Männer (1. Split --> diese Verteilung dominiert den Plot) # mehr Männer fühlten sich gründlich untersucht als Frauen. # mehr Frauen fühlten sich neutral untersucht als Männer. # Männer und Frauen fühlten sich in selben Anteilen schlecht untersucht. # Tendenz bei Männern und Frauen erkennbar, dass eine gründliche Untersuchung # auch zu einer höheren Zufriedenheit geführt hat. ################################################################################ ### Pairsplot ### ################################################################################ # Ein Pairsplot ist geeignet, um einen schnellen Überblick über alle vorkommenden # Variablen zu erhalten. # Auf der Diagonale sind die Häufigkeiten der Merkmalsausprägungen der Variablen. # Außen: paarweise Mosaikplots # An den paarweisen Mosaikplots kann man schnell Zusammenhangsstrukturen zwischen # den Variablen erkennen, also, ob womöglich Abhängigkeit zwischen den Variablen # vorliegt. # Deshalb ist der Plot gut geeignet, um erste Eindrücke über mögliche Unabhängig- # keitstest zu erhalten pairs(tab3, diag_panel_args = list(var_offset=1.2, just_leveltext = "left", rot=330)) # var_offset : Variablenüberschriften nach oben verschoben # just_leveltext = "left" : Labels linksbündig # rot=330 : Labels um 330 Grad gedreht # Aufgrund diesen Mosaikplots würde man vermuten, dass... # ...das Geschlecht keinen Einfluss auf die Zufriedenheit hat # ...das sich Männer besser untersucht fühlten als Frauen # ...die Zufridenheit davon abhängt, ob man gründlich untersucht wurde ################################################################################ ### Assoziationsplot ### ################################################################################ # Genau wie Sieveplot auch für Kontingenztafeln höherer Ordnung möglich # Interpretationen bleiben bei beiden Plots identisch wie bei der # Visualisierung von zweidimensionalen Kontingenztafeln assoc(tab3, split=TRUE, labeling=labeling_values(value_type=c("residuals"), suppress=FALSE, gp_text=gpar(cex=1.2))) ################################################################################ ### Doubledeckerplot ### ################################################################################ # Doubledeckerplots sind "quasi" Mosaikplots. # Hier wird nur nicht mehr abwechselnd gesplittet, sonder alle Einflussgrößen # horizontal, die Zielgröße vertikal (keine Zwischenräume, sondern andere Farben) # Doubledeckerplots visualisiern die Abhängigkeit einer kategorialen Variable # von anderen kat. Variablen. doubledecker(tab3, margins=c(1,10,3,1), labeling_arg=list(abbreviate=c(letzter_besuch=1))) # abbreviate=c(letzter_besuch=1) : kürzt die Labels der Merkmalsausprägungen # der Variablen gründlich untersucht mit 1 # Buchstaben ab # Um den Plot wie in den Folien zu erhalten muss man die Grafik einfach per # Hand in die Breite ziehen ################################################################################ # Kontingenztafel 4 tab4 <- structable(letzter_besuch ~ alter + geschlecht + gruendlich_untersucht) tab4 ################################################################################ ### Mosaikplot ### ################################################################################ mosaic(tab4, split=TRUE, margins=c("right"=6.2), labeling_arg=list(rot_label=c("left"=0,"right"=0), offset_labels=c("right"=1.2), offset_varnames=c("right"=3))) # Um so mehr Variablen man betrachtet, desto unübersichtlicher wird ein Plot. # Probleme würde man bekommen, wenn beispielsweise wenig 18-39-jährige in den # Daten vorhanden wären --> man könnte den Bereich rechts oben nicht mehr # erkennen --> Deshalb: Bedingter Mosaikplot ################################################################################ ### Bedingter Mosaikplot ### ################################################################################ # Argumentübergabe wie in lattice cotabplot(~gruendlich_untersucht + letzter_besuch | geschlecht + alter, split=TRUE, panel = cotab_mosaic, panel_args = list(margins = c(1,1,1,2), varnames = FALSE, rot_label=c("left"=0), offset_labels=c("left"=1.5))) # panel = cotab_mosaic: Mosaikplot (auch cotab_accoc, cotab_sieve möglich) # Hier: Erstellung von Mosaikplots für die beiden Variablen gründlich untersucht # und letzter Besuch (jeweils für alle Kombinationen von Alter und Geschlecht) # Zu beachten ist, dass bei bedingten Mosaikplots nicht mehr die Verteilungen # der Variablen, auf die man bedingt, ersichtlich sind (Hier: Alter, Geschlecht) # Interpretation: # Absolute Größen nicht mehr innerhalb der Panels vergleichbar # Aber: Verhältnisse zwischen den Panels interpretierbar ################################################################################ # Highlighting und Shading # ################################################################################ # Ausgangsmosaikplot mosaic(tab1, split=TRUE) # Ziel: Einfärben von Zellen # Highlighting einer bestimmten Kategorie # Residuenshading ################################################################################ # Einfärben der Zellen # ################################################################################ # Definition einer Farbmatrix mit 3 Zeilen und 3 Spalten mycol <- matrix(c("red", "blue", "black", "orange", "lightblue", "darkgrey", "yellow", "green", "lightgrey"), ncol=3) # Einfärben jeder Zelle des Mosaikplots in einer anderen Farbe gemäß der Matrix mosaic(tab1, split=TRUE, gp=gpar(fill=mycol)) # gp=gpar(fill=mycol): füllt die Flächen entsprechend der Farbmatrix # will man auch die Ränder entsprechend einfärben, benötigt # man zusätzlich gp=gpar(col=mycol) ################################################################################ # Highlighting # ################################################################################ # Nun möchte man alle Beobachtungen, die beim letzten Besuch zufrieden waren # in einer eigenen Farbe darstellen, die, die neutral oder unzufrieden waren in # einer anderen Farbe. # Definiere Farbvektor für die Spalten mycol=c("lightgrey", "lightgrey", "black") # Highlighting der Kategorie "zufrieden" in schwarz mosaic(tab1, split=TRUE, gp=gpar(fill=mycol, col=mycol), spacing=spacing_highlighting) # fill=mycol füllt die Fläche entprechend dem Farbvektor mycol # col=mycol zeichnet die Ränder in den Farben entsprechend des Vektors # spacing=spacing_highlighting entfernt die vertikalen Zwischenräume ################################################################################ # Binary Shading # ################################################################################ # Das Binary Shading färbt jede Fläche unter DEFAULT in rot oder blau. Je nachdem # ob die Pearson-Residuen größer (blau) oder kleiner (Rot) Null sind. # Die absolute Größe der Pearson Residuen ist hier nicht ersichtlich, also auch # nicht deren Einfluss auf mögliche Unabhängigkeitestests. # Nur das minimale und maximale Residuum wird rechts in der Leiste dargestellt mosaic(tab1, split=TRUE, gp=shading_binary) # Einfärbung rot : negative Residuen # Einfärbung blau: positive Residuen mosaic(tab1, split=TRUE, gp=shading_binary, gp_args=list(col=c("green", "orange"))) # Einfärbung orange: negative Residuen # Einfärbung grün: positive Residuen ################################################################################ # HSV Shading # ################################################################################ # Hier wird die HSV Palette verwendet. Später noch die HCL Palette. Ansonsten # ist die Funktionsweise der beiden Shadingvarianten identisch. mosaic(tab1, split=TRUE, gp=shading_hsv) # Größe und Richtung der Residuen ersichtlich # # Richtung der Residuen: # blau wieder für positive Residuen, rot für negative # # Größe der Residuen: # Residuum in [0, 2] bzw. [0, -2] --> weiß # Residuum in [2, 4] bzw. [-2, -4] --> schwaches blau/rot # Residuum > 4 bzw. < 4 --> kräftiges blau/rot # cut-off points von 2 und 4, da Pearson Residuen approx. standard NV sind. # # Zusätzlich: Durchführung eines Chi-Quadrat-Unabhängigkeitstests # # Residuen der eingefärbten Zellen sind signifikant auf dem 95% Level. # Daraus folgt, dass diese Residuen maßgebend für die Ablehnung der # Unabhängigkeitsthese sind mosaic(tab1, split=TRUE, gp=shading_hsv, margins=c(0.1,0.1,0.1,2.5), gp_args=list(h = c(0.45, 0.1), v=c(1,0.5),interpolate=c(1.64,1.96,2.58))) # interpolate setzt feste cut-off Punkte für die Residuen (hier: 1.64,1.96,2.58) # Diese Werte sind nicht beliebig gewählt, sondern entsprechen bei der NV # (Pearson Residuen sind approx. normalverteilt) einem Alpha von 0.1, 0.05, 0.01 # h = c(0.45, 0.1) entspricht dem hue value (=Farbe) ################################################################################ # Friendly Shading # ################################################################################ # Das Friendly Shading basiert auf den Farben der HSV Palette. # Fixe cut-off Punkte sind unter DEFAULT bei 2 und 4 (Alpha=0.05, 0.0001) # Dementsprechend werden die Flächen von neg. Residuen in rot, von # pos. Residuen in blau dargestellt. # Zusätzlich werden die Ränder der Flächen noch in diesen Farben eingefärbt, # selbst wenn die Grenze der cut-off Punkte nicht erreicht wird. # Eine Fläche, die nur einen farbigen Rand hat, ansonsten weiß ist, # kann man folglich so interpretieren, als dass, die Residuen absolut kleiner # sind als der kleinste cut-off Punkt. An der Farbe und Gestalt der Linie ist zu # erkennen, ob die Residuen > 0 oder < 0 sind. mosaic(tab1, split=TRUE, gp=shading_Friendly) ################################################################################ # HCL Shading # ################################################################################ # Das HCL Shading ist komplett analog zu HSV Shading, verwendet nur eine andere # Farbpalette mosaic(tab1, split=TRUE, gp=shading_hcl) # Funktion für den Farbverlauf ipol <-function(x) pmin(x/4,1) # Kontinuierliches Shading mosaic(tab1, split=TRUE, gp=shading_hcl, gp_args=list(interpolate=ipol)) ################################################################################ # Maximum Shading # ################################################################################ # Das Maximum Shading basiert auf hcl-Farben. # Interpretation von Größe und Richtung der Residuen bleibt erhalten. # Aber: Verwendung einer anderen Teststatistik und somit auch andere cut-offs. # Teststatistik M = max |Residuen| mosaic(tab1, split=TRUE, gp=shading_max) mosaic(tab1, split=TRUE, gp=shading_max, gp_args=list(level = c(0.9,0.95,0.99))) # Hier kann man keine Grenzen mit interpolate setzen, sondern gibt das Niveau # Alpha mittels level an. # Als DEFAULT sind die Levels 0.9 und 0.99 gesetzt, können jedoch jederzeit, wie # im zweiten Beispiel, geändert werden. # Zur Motivation: # Warum benötige ich das Maximum Shading? # Es kann durchaus vorkommen, dass der Chi-Quadrat-Unabhängigkeitstest # die Nullyhypothese ablehnt, also eine Abhängigkeit der Variablen besteht, aber # alle |Residuen| < 2. Das bedeutet, die Flächen bleiben ungefärbt. data("Arthritis", package="vcd") art <- xtabs(~Treatment + Improved, data=Arthritis, subset = Sex == "Female") # Teststatistik signifikant, aber kein Shading mosaic(art, gp=shading_hcl) # Trotzdem möchte man die Zellen identifizieren können, die zur Ablehnung # der Nullhypothese unter diesen Umständen führen - deshalb das Maximum Shading # Teststatistik signifikant und Shading mosaic(art, gp=shading_max) ################################################################################ # Maximum Shading für signifikante und nicht signifikante Unterschiede # ################################################################################ mosaic(tab1, split=TRUE, gp=shading_max, gp_args=list(level=c(0.9,0.99))) # Der Maximum Test ist signifikant --> Lehne Unabhängigkeitsthese ab # --> hier erscheint der Plot in "kräftigen" Farben tabmax <- structable(letzter_besuch ~ geschlecht) mosaic(tabmax, split=TRUE, gp=shading_max, gp_args=list(level=c(0.1,0.3))) # Der Maximum Test ist nicht signifikant --> Unabhängigkeitsthese kann nicht # abgelehnt werden --> hier erscheint der Plot in "dunklen, grauen" Farben ################################################################################