Danke EDi,
jede Auseinandersetzung mit dem Thema hilft, und wenn es nur dabei hilft, sich die Inkonsistenzen besser einzuprägen.
Ich könnte verstehen, dass Balken wegfallen, weil man den Balken eine Breite zuspricht und die Ränder der Balken außerhalb meiner x-limits lägen. Inkonsistent ist dann aber, dass Punkte in geom_point keine Breite haben:
Code: Alles auswählen
library(ggplot2)
eckpunkte <- data.frame(x=c(0,0,1,1), y=c(0,1,0,1))
ggplot(eckpunkte, aes(x=x, y=y)) +geom_point(size=25) + xlim(c(0,1))
Da werden die Punkte auch mit
xlim gezeichnet, selbst wenn sie über den Bildrand hinaus ragen.
Merke: Balken haben eine Breite aber Punkte nicht.
xlim(c(5, 10) ist gleichzusetzen mit scale_x_continuous(limits = c(5, 10)). D.h. es bezieht sich auf eine kontinuierliche x-Achse.
Dies macht ja aber bei einem barplot aus meiner Sicht wenig Sinn, da die x-Achse implizit diskret ist.
Irgendwie stecken xlim und ylim noch aus base so tief drin. Es passiert mir halt immer noch. Meine x-Achse ist nicht kontinuierlich, aber doch metrisch. Sowas kennt ggplot aber nicht. Diskret heißt in ggplot ja nicht diskret, sondern
ordered. Eine Achse für diskrete ganze Zahlen mit scale_x_discrete nachzuahmen ist eher aufwändig, was ich weiter unten zeige.
In dem Fall würde ich aber einfach vorher die 5er und 10 wegfiltern....
Da hast Du mich falsch verstanden, ich wollte nichts wegfiltern! Wenn ein Summenscore von 5 bis 10 reicht, dann will ich oft auch, dass auf der Achse der gesamte Bereich von 5 bis 10 dargestellt wird. Selbst dann, wenn die Werte unbesetzt sind. Ich mache mal ein anderes Beispiel. Nehmen wir an, wir legen jedem Probanden einen Fragebogen mit mehreren Fragen vor und bilden Summenscores und da können jetzt Werte zwischen 0 und 48 herauskommen (
Beispiel). Die Extreme 0 und 48 sind aber selten. Ich habe mal versucht, das mit meinen bisherigen Kenntnissen und, Deinem Rat folgend, als factor um zusetzen. Das sieht dann so aus:
Code: Alles auswählen
library(ggplot2)
# beispieldaten
fragen <- data.frame(item1 = rbinom(100, 48, .7))
# Umwandlung und Achsenpflege:
fragen$item1.f <- factor(fragen$item, levels = 0:48)
ggplot(fragen, aes(x=item1.f)) +
geom_bar() +
scale_x_discrete(limits=as.character(0:48),
breaks = as.character(seq(0, 48, 4)))
Ich muss also erst den Summenscore in einen factor umwandeln, dann die limits in character umwandeln und mich dann um die x-Achsenbeschriftung selbst kümmern. Dafür funktioniert es dann auch, wenn mal eine 0 oder eine 48 vorkommen sollte.
Ist das so kompliziert, oder geht das auch etwas kürzer, mehr so in der Art von
oder wie die jungen Leute heute schreiben würden:
Code: Alles auswählen
fragen %>% `[`("item1") %>% table() %>% plot(type = "h", xlim = c(0,48))
LG,
Bernhard