Säulendiagramm mit mehr als zwei Variablen

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Quitter
Beiträge: 11
Registriert: Di Nov 10, 2020 5:00 pm

Säulendiagramm mit mehr als zwei Variablen

Beitrag von Quitter »

Moin,
ich habe zwar in einem anderen Thread etwas nebenbei schon gefragt, allerdings würde ich es in diesem gern spezifisch.
Ich möchte gern ein Säulendiagramm mit mehr als zwei Variablen erstellen.
Bspw. mit "Tage" und der Wassermenge für "Frauen", "Männer" und "Kinder" - also im Grunde vier Spalten mit gleich vielen Zeilen.
Ist das irgendwie machbar und wenn ja, wie?
Ich sitze hier schon den ganzen Tag und zerbreche mir dir Kopf.

Liebe Grüße
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von bigben »

Hallo Quitter,

Vergleichende Zeitreihen sind oft viel besser mit Punkten oder Linien als mit Balkengrafiken zu machen, beispielsweise so:

Code: Alles auswählen

bsp <- data.frame( Tage = 1:5,
                   Frau = c(10, 20, 30, 40, 45),
                   Mann = c( 6, 16, 25, 32, 33),
                   Kind = c(19, 28, 42, 46, 50))

plot(bsp$Tage, bsp$Frau, type = "b", col =2, ylim = c(0,50),
     xlab = "Tage", ylab ="Wasser")
lines(bsp$Tage, bsp$Mann, type = "b", col = 3)
lines(bsp$Tage, bsp$Kind, type = "b", col = 4)
legend("bottomright", fill = 2:4, legend =c("Frauen", "Männer", "Kinder"))
Dazu kommt noch, dass die Barplot-Funktion in base graphics ungewöhnlich bzw gewöhnungsbedürftig ist. Sie nimmt beispielsweise lieber Matrizen als Dataframes. Mal als Ausgangpunkt:

Code: Alles auswählen

bsp <- data.frame( Frau = c(10, 20, 30, 40, 45),
                   Mann = c( 6, 16, 25, 32, 33),
                   Kind = c(19, 28, 42, 46, 50))


barplot(t(as.matrix(bsp)))
Wenn man anspruchsvoll ist und es ausgerechnet um Balkengrafiken geht lohnt sich ggf auch ggplot2: http://www.sthda.com/english/wiki/ggplo ... ualization

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Quitter
Beiträge: 11
Registriert: Di Nov 10, 2020 5:00 pm

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von Quitter »

Hallo Bernhard,
danke für deine Antwort.
Mit dem Plot hat es funktioniert. Ich habe auch erst überlegt die Daten in einem Liniendiagramm zu visualisieren. Allerdings weisen viele Punkte den selben Wert auf, sodass es eher eine einfarbige Linie mit ein paar andersfarbigen Ausreißern werden würde.
Das erstellen des Barplot hat soweit mit der Matrize geklappt, allerdings werden bei beside=TRUE die ersten drei Balken nicht als "1" zusammengefasst.
Mit ggplot2 habe ich mit gestern schon etwas auseinandergesetzt. Deinen Link schaue ich mir allerdings nochmal an, vielleicht klappt es ja auch damit.
Vielen Dank schonmal!

Edit: Ok, ein Säulendiagramm mit 50 Tagen und jeweils 3 Werten nebeneinander ist glaub ich zu groß :D das wären ja 150 Säulen auf der x-Achse.
Vielleicht sollte ich die Verläufe einfach einzeln in Liniendiagrammen oder Barplots darstellen, oder eben gestaffelt.

Liebe Grüße
Frederik
Zuletzt geändert von Quitter am Mi Nov 11, 2020 10:45 am, insgesamt 1-mal geändert.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von bigben »

Hallo Frederik,
Quitter hat geschrieben: Mi Nov 11, 2020 10:27 amDas erstellen des Barplot hat soweit mit der Matrize geklappt, allerdings werden bei beside=TRUE die ersten drei Balken nicht als "1" zusammengefasst.
Das kann ich nicht nachvollziehen. Dieser Code:

Code: Alles auswählen

bsp <- data.frame( Frau = c(10, 20, 30, 40, 45),
                   Mann = c( 6, 16, 25, 32, 33),
                   Kind = c(19, 28, 42, 46, 50))


barplot(t(as.matrix(bsp)), beside = TRUE, names.arg = 1:5)
ergibt bei mir dieses Bild:
Barplot.jpeg

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Quitter
Beiträge: 11
Registriert: Di Nov 10, 2020 5:00 pm

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von Quitter »

Moin,
danke. Den Befehl "names.arg" wusste ich nicht ;)
Jetzt hab ich alles zusammen denke ich. Ich probiere einfach mal aus.

Liebe Grüße
Frederik
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Säulendiagramm mit merh als zwei Variablen

Beitrag von bigben »

names.arg und weitere Argumente, mit denen man die Funktion barplot() steuern kann stehen in den eingebauten Hilfeseiten, aufrufbar in R mit

Code: Alles auswählen

help("barplot")
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: Säulendiagramm mit mehr als zwei Variablen

Beitrag von EDi »

Edit: Ok, ein Säulendiagramm mit 50 Tagen und jeweils 3 Werten nebeneinander ist glaub ich zu groß :D das wären ja 150 Säulen auf der x-Achse.
Vielleicht sollte ich die Verläufe einfach einzeln in Liniendiagrammen oder Barplots darstellen, oder eben gestaffelt.
In ggplot gibt's sogenannte facets. Sicherlich mal einen Blick Wert...
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.
Quitter
Beiträge: 11
Registriert: Di Nov 10, 2020 5:00 pm

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von Quitter »

Moin,
langsam läuft es besser.
Eine Sache habe ich allerdings "grind()" setzt sich bei mir immer in den Vordergrund - also vor Punkte, Boxplots etc.
Kann man das irgendwie ändern?

Liebe Grüße
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von bigben »

Moin, was ist grind()?

Das Edit, auf das EDi sich bezieht, hatte ich glatt übersehen. Ich bleibe bei Liniendiagrammen und wenn es oft zu ähnlichen oder gleichen Werten kommt, dann muss man halt teiltransparente Farben nehmen und zum Ausgleich etwas breitere Linien. Als Ausgangspunkt für eigene Experimente vielleicht sowas:

Code: Alles auswählen

time <- 1:50
f <- .1 * time + .8*cos(.3*time)
m <- f + .5*cos(.1*time) + .01*time
k <-jitter((f + m)/2)
plot(f ~ time, type = "p", col ="white")
lines( f ~ time, type = "p", col = '#FF000044', pch = 16)
lines( f ~ time, type = "l", col = '#FF000044', lwd = 4)
lines( m ~ time, type = "p", col = '#00FFFF44', pch = 16)
lines( m ~ time, type = "l", col = '#00FFFF44', lwd = 4)
lines( k ~ time, type = "p", col = '#0000FF44', pch = 16)
lines( k ~ time, type = "l", col = '#0000FF44', lwd = 4)
legend("topleft", fill = c('#FF000044', '#00FFFF44','#0000FF44'), 
       legend = c("Frauen", "Männer", "Blagen"), inset = .02)
Letztlich muss man sich das aber mit den tatsächlichen Daten anschauen und damit spielen.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Quitter
Beiträge: 11
Registriert: Di Nov 10, 2020 5:00 pm

Re: Säulendiagramm mit mehr als zwei Variablen

Beitrag von Quitter »

Moin,
grid() (ohne "n" :D ) sind Gitternetzlinien für die Orientierung bzw. besseres Ablesen hab ich gedacht.
Deinen Tipp werde ich mal ausprobieren, danke.
Ich habe sonst aber auch eine zweite Variante in der ich mit mfrow() das Plot Area 3-geteilt habe. So gehts auch denke ich.

Liebe Grüße
Antworten