Boxplot add = TRUE (keine eigentliche Frage)

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Boxplot add = TRUE (keine eigentliche Frage)

Beitrag von bigben »

Guten Abend!

Ich habe keine Frage, nur einen Bericht und der muss raus. Ich habe heute Abend, am 3. Advent, deutlich über eine halbe Stunde über Tickmarks in base gegrübelt. Mein Freund und Kollege hatte eine schöne Idee für eine interessante Studie und ich habe Kooperation für die Auswertung zugesagt. Einen schönen Plot haben wir uns schon ausgedacht, ob wir das als Violinplot oder als Boxplot machen, ist noch offen. Mein Freund hätte die Tickmarks gerne nach innen statt nach außen - bitte schön, soll erhaben. Schließlich ist das R und hier ist alles möglich. `tcl` auf einen positiven Wert gesetzt, schon sind die Tickmarks innen:

Code: Alles auswählen

plot(1:10, 1:10, tcl=.5)
eins.png
Lange herumgespielt, bis Größe, Pointsize, Auflösung etc. stimmen, eine Version mir Violinplot und eine mit Boxplot gespeichert und dann bei der letzten Kontrolle: Sch***e, die Tickmarks stimmen nicht, und zwar nur auf der x-Achse! Warum?

Code: Alles auswählen

plot(1:10, 1:10, tcl=.5)
boxplot(rnorm(50,5,2), at=5,horizontal= TRUE, add = TRUE)
zwei.png
Kein Fehler im Code zu erkennen - ewig gesucht. Wenn nichts hilft - Forum fragen. Also erstmal ein reproduzierbares Minimalbeispiel basteln. Das hat schon oft geholfen, und ich musste nicht mehr im Forum fragen. Fehler ist aber im Minimalbeispiel nicht zu reproduzieren. Über eine halbe Stunde habe ich herumgesucht, bis ich die Idee hatte: Im Violinplot sind die Tickmarks ok, nur beim Boxplot falsch. Die Lösung:

Wenn man einen Boxplot per add=TRUE einem Plot hinzufügt, dann beschriftet die Funktion noch einmal die Ordinate!

Ich weiß, dass base graphics seine Quirks hat, aber wer rechnet denn mit sowas?

Ich musste jetzt einfach mal meinem Ärger darüber Luft machen und wollte es einmal geschrieben haben, damit anderen die Suche vielleicht verkürzt wird. Man muss tatsächlich boxplot() mit dem Argument `xaxt="n"` aufrufen, dann verhält es sich so, wie ich das erwartet hätte. Schade um die schöne Zeit.

Irgendwie komme ich mit base meist besser zurecht, aber es ist immer wieder der letzte Schritt, die inhaltlich korrekte Grafik in ein hochauflösendes Format zu bekommen, das ich einreichen kann, bei dem ich von Problemen überrascht werde, mit denen ich nicht gerechnet hätte und die völlig überflüssig sind. In ggplot2 ist dieser letzte Schritt immer eine Kleinigkeit gewesen: ggsave mit großen Zahlen aufrufen und fertig. Bin ich der einzige, dem es so geht?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Boxplot add = TRUE (keine eigentliche Frage)

Beitrag von EDi »

Ich nutze fast nur noch ggplot2.
Base-graphic nutze ich nur für spezielle Probleme, die mit ggplot zu Aufwändig sind.

Ich exportiere auch nur nach .svg (für artikel, wird dann weiter umgewandelt (via inkscape) je nach journal) oder .tikz (für reports, vorträge, doktorarbeit, etc weil ich dann die gleiche Schriftart/skalierung habe wie im restlichen LaTeX-Dokument).

Für ggsave nutze ich meist nie "große Zahlen", bei einem rechteckigen plot orientiere ich mich an der "7".
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Curnen
Beiträge: 27
Registriert: Fr Nov 18, 2016 3:45 pm

Re: Boxplot add = TRUE (keine eigentliche Frage)

Beitrag von Curnen »

EDi hat geschrieben:Ich nutze fast nur noch ggplot2
Ich auch, aber auch da können einen unerwartete Probleme mit der Achsenformatierung heimsuchen... :roll:

Erst neulich hatte ich den Fall, dass ggplot2 mir unbedingt die Werte einer kategorischen Variable alphabetisch sortiert aufzwingen wollte. Üblicherweise übernimmt ggplot2 dafür ja die Reihenfolge der Level eines Faktors - nur scheinbar nicht, wenn zwei Geoms/Datenquellen beteiligt sind und einer der Faktorlevels keine Werte beinhaltet.

Code: Alles auswählen

data(iris)
library("ggplot2")

# wir ändern mal die alphabetische Reihenfolge
iris[,"Species"] <- relevel(iris[,"Species"],"versicolor")
# und fügen einen weiteren Level ohne zugehörige Daten ein
levels(iris[,"Species"]) <- c(levels(iris[,"Species"]),"fantasia") 

iris_per_category <- as.data.frame(table(iris[,"Species"]))


irisplot <- ggplot(iris,aes(x=Species,y=Petal.Width)) + geom_boxplot()
irisplot_v2 <- irisplot + geom_label(aes(y=max(iris[,"Petal.Width"])*1.1,x=Var1,label = paste("n=",Freq,sep="")),data=iris_per_category,size=3,lineheight=0)
irisplot <- irisplot + geom_label(aes(y=max(iris[,"Petal.Width"])*1.1,x=Var1,label = paste("n=",Freq,sep="")),data=iris_per_category[iris_per_category[,"Freq"]>0,],size=3,lineheight=0)

# gewünschte Reihenfolge, aber leider ohne "fantasia"
print(irisplot)
# alphabetische Reihenfolge ...
print(irisplot_v2)
# ... aber nur solange eine Kategorie keine Datenpunkte hat: 
irisplot_v2[["data"]][120:130,"Species"] <- "fantasia"
print(irisplot_v2)
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Boxplot add = TRUE (keine eigentliche Frage)

Beitrag von EDi »

Ja, ggplot2 hat auch seine Tücken, vorallem auch wenn man unterschiedlichen Datenquellen in einen plot bringen will.

Ich probiere gerade für meine Disputation einen Plot mit dem xkcd theme zu verschöneren.
Den Code, den ich für diese Abbildung vor 2 Jahren geschrieben hab funktioniert leider nicht mehr so wie er soll (soviel zum Thema reproduzierbarkeit :() und ich will nur eine Kleinigkeit ändern. :twisted:

Ich könnte die Pakete alle downgraden (hab alle versionen von damals archiviert), bin aber eher drauf und dran das xkcd package zu verbessern (letzte Änderung des packages schon länger her...). So kann man seinen Freitag auch verbringen....
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten