Balkendiagramm, Variablen auswählen automatisch

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Balkendiagramm, Variablen auswählen automatisch

Beitrag von gming11 »

Hallo Liebe Leute,

ich habe folgendes Anliegen. Ich habe einen Datensatz mit etwa 100 Variablen Mittelwertergebnissen und je zwei Gruppen Placebo und Verum (im Code Snippet mal für 5 Variablen angelegt). Nun möchte ich vereinfacht gesagt jeweils Placebo und Verum mittelwerte von einer variable mit einer anderen Variable grafisch z.b in einem Balkendiagramm nebeneinander darstellen. Ich weiß allerdings nicht wie ich das in meinem Fall machen soll. Zudem frage ich mich, ob es möglich ist hier auch eine „Funktion“ zu basteln, welche mit meiner Eingabe dann die Plots ausgibt, da ich immer zwei Variablen miteinander vergleichen will.

Anbei ein Pseudodatensatz:

Code: Alles auswählen

names <- c("Gruppe", "Alter", "Gewicht", "var1","var2","var3","var4","var5")
mittelwertePlacebo <- c(0,50,80,2,0.5,3,1,1)
mittelwerteVerum <- c(1,59,79,1,0.2,2,0.5,0.5)
bsp1 <- t(data.frame(names,mittelwertePlacebo, mittelwerteVerum))
Als Beispiel würde ich gerne die Ausprägungen von Placebo und Verum von „var1“ mit “var3" vergleichen . Vielleicht hat auch jemand eine Idee für eine Funktion, in welcher ich dann „var1“ und „var3“ eingebe und das Balkendiagramm ausgegeben wird.
PS: Ich habe bewusst das Pseudodatenbeispiel transponiert, da meine Daten so aussehen :)

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

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von bigben »

Hallo gming,
gming11 hat geschrieben: Mi Jul 28, 2021 11:34 amPS: Ich habe bewusst das Pseudodatenbeispiel transponiert, da meine Daten so aussehen
Das mag sein, aber wir sind hier nicht bei Excel, Daten dürfen nicht aussehen, wie sie wollen. In Deinem Beispielcode sind die Zahlen als Texte (character) hinterlegt und damit kann R nicht arbeiten. Wir müssen die Daten also erst umformen.

Kannst Du damit was anfangen bzw. das mit Deinen Grafikparametern versehen?

Code: Alles auswählen

names <- c("Gruppe", "Alter", "Gewicht", "var1","var2","var3","var4","var5")
mittelwertePlacebo <- c(0,50,80,2,0.5,3,1,1)
mittelwerteVerum <- c(1,59,79,1,0.2,2,0.5,0.5)
bsp1 <- t(data.frame(names,mittelwertePlacebo, mittelwerteVerum))

bsp <- as.data.frame(bsp1[2:3,])
names(bsp) <- bsp1[1,]
bsp <- as.data.frame(apply(bsp, 1:2, as.numeric))
str(bsp)


meinplot <- function(spaltenname = "var2"){
    barplot(as.matrix(bsp[,c("var1", spaltenname)]),
            legend.text = TRUE, beside = TRUE)
}

meinplot("var2")
meinplot("var3")
meinplot("var4")
Alternativ, wenn Du gerne ggplot2 verwenden möchtest, müssten wir die Daten wieder untereinander schreiben/umformen, dabei aber als Zahlenwerte belassen:

Code: Alles auswählen

library(ggplot2)
library(tidyr)
bsp.long <- pivot_longer(bsp, cols = c("var1", "var2", "var3", "var4", "var5"))

meinggplot <- function(spaltenname = "var2"){
  ggplot(subset(bsp.long, name == "var1" | name == spaltenname)) +
  geom_col(aes(y = value, x = name))
}

meinggplot("var2")

meinggplot("var3")

meinggplot("var4")

meinggplot("var5")
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von gming11 »

Hallo Dankeschön für die Rückmeldung und sorry für das schlechte Code Snippet, da hast du recht, dass man da zuerst einiges machen musst. In meinem Originaldatensatz passt das soweit. Nur meine Frage ich wollte mit ggplot arbeiten und dein Code sieht gut an, allerdings ist dieser Schritt:

Code: Alles auswählen

bsp.long <- pivot_longer(bsp, cols = c("var1", "var2", "var3", "var4", "var5"))
für meinen Datensatz etwas langwierig, da ich 100 Variablen ca. habe. Genau vor diesem Problem stand ich vorher, da ich nicht wusste wie ich den Datensatz so transformiere, dass es mit ggplot effizient funktioniert und ich zuvor nicht alle Variablen eingeben muss.Hat jemand hierzu einen Tipp oder Trick? Dankeschön !

Der Trick mit der eingebauten Funktion in ggplot ist toll, genau so hätte ich es probiert, bin allerdings gescheitert!

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

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von bigben »

Hallo gming,
gming11 hat geschrieben: Do Jul 29, 2021 7:48 amfür meinen Datensatz etwas langwierig, da ich 100 Variablen ca. habe.
Naja, in irgendeiner Form musst Du pivot_longer schon sagen, welche Spalten es denn sein sollen. Erraten oder aus irgendwas ableiten kann die Funktion das nicht. Erfreulicherweise bietet die Funktion pivot_longer eine Reihe möglicher Abkürzungen an, aber ohne konkret Deine Spaltennamen zu kennen ist es schwer zu sagen, welches die richtige ist. Ob man einfach alle Spalten nehmen kann oder ob man besser die Spalten definiert, die nicht umgebrochen werden sollen oder ob alle umzubrechenden Spalten am Anfang alle gleich heißen oder ob man darauf zurückfallen muss, Bereiche von Spaltennummern anstelle der Namen anzusprechen.

Ich empfehle Dir diesen Text zu lesen: https://cran.r-project.org/web/packages ... pivot.html

Alternativ und sehr übersichtlich kann man das auch mit der Funktion melt aus dem Paket data.table machen, wenn man entweder einfach alle Spalten mit Zahlen haben will oder eine regex (einen regulären Ausdruck) definieren kann, der die relevanten Spalten betrifft.

Dazu böte sich dann als Lektüre an: https://cran.r-project.org/web/packages ... shape.html

Um alle Spalten mit "var" in bsp ins lange Format zu bringen könnte man dann folgendes schreiben, egal wieviele hundert Variablen das dann betrifft:

Code: Alles auswählen

library(data.table)
setDT(bsp)
melt(bsp, measure = patterns("var"))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von gming11 »

Hallo,

dankeschön für die Idee.

Das Problem ist ich habe den Datensatz wie in einen vorherigen Post wie folgt generiert:

Code: Alles auswählen

w <- factor(c("m", "w", "w", "m", "m", "w", "w", "w", "m", "m"))
x <- c(28, 18, 25, 29, 21, 19, 27, 26, 31, 22)
y <- c(80, 55, 74, 101, 84, 74, 65, 56, 88, 78)
z <- c(170, 174, 183, 190, 185, 178, 169, 163, 189, 184)
bsp1 <- data.frame(w, x, y, z)
MittelwerteGesamt<-colMeans(bsp1[sapply(bsp1, is.numeric)], na.rm=TRUE)
MW_G<-t(as.data.frame(MittelwerteGesamt))
..um die Mittelwerte zu erhalten. Der Befehl:

Code: Alles auswählen

setDT(MW_G)
geht hier dann nicht, da es nicht kompatibel ist. Kannst du mir hier helfen, was ich hier machen könnte? Die Idee mit Melt würde sich gut anbieten, da durch die patternsuche hier zumindest schnell und effizient alle Variablen ausgewählt werden können.

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

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von bigben »

Ja, Deine Daten sind ein array, das kann man entweder mit as.data.frame in einen Dataframe umwandeln auf den man dann setDT anwenden kann, man kann aber auch gleich die Abkürzung as.data.table nehmen:

Code: Alles auswählen

MW_G <- as.data.table(MW_G)
melt(MW_G)
Das Ergebnis von tidyr::pivot_longer ist ein tibble, das Ergebnis von data.table::melt ist ein data.table, damit es im weiteren Verlauf keine blöden Überraschungen gibt macht es wahrscheinlich Sinn, die Ergebnisse von beiden mit as.data.frame wieder in einen ganz gewöhnlichen Dataframe umzuwandeln, also

Code: Alles auswählen

MW_G <- as.data.table(MW_G)
as.data.frame(melt(MW_G))
Wem das zu unübersichtlich ist, der nimmt vielleicht lieber die modernere Pipe-Schreibweise:

Code: Alles auswählen

MW_G |> 
  as.data.table() |> 
  melt() |> 
  as.data.frame()
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von gming11 »

Super vielen lieben dank!!,

Ich habe nun mittels

Code: Alles auswählen

MW_G <- as.data.table(MW_G)
as.data.frame(melt(MW_G))
den Datensatz soweit fähig ihn einsetzen zu können.

Bei ggplot nun aber meine Frage, da der Code von dir

Code: Alles auswählen

meinggplot <- function(spaltenname = "var2"){
  ggplot(subset(bsp.long, name == "var1" | name == spaltenname)) +
  geom_col(aes(y = value, x = name))
}

meinggplot("var2")
ja die Gruppen 0 und 1 nicht berücksichtig und somit bei var1 das grafische Ergebnis 2+1 bzw. bei var2 das Ergebnis 0.7 ersichtlich ist, wollte ich noch fragen, wie man hier das ganze auf die Gruppe aufsplittet?

(Vielleicht hast du auch zufällig eine gute Hilfsseite für ggplot, ich bin mit der Cran Erklärung etwas überfordert)

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

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von bigben »

Hallo,

man könnte meinggplot so ersetzen:

Code: Alles auswählen

meinggplot <- function(spaltenname = "var2"){
    ggplot(subset(bsp.long, name == "var1" | name == spaltenname)) +
        geom_col(aes(y = value, x = name, fill = as.factor(Gruppe)), position = "dodge")
}

meinggplot("var2")
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gming11
Beiträge: 27
Registriert: Do Feb 25, 2021 10:37 am

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von gming11 »

Dankeschön, nur wenn das so passiert, dann habe ich ein gestapeltes Balkendiagramm und nicht ein gruppiertes Diagramm.

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

Re: Balkendiagramm, Variablen auswählen automatisch

Beitrag von bigben »

Hallo gming,

bitte beschreib genau "was so passiert".

Wenn ich die Teile aus diesem Thread zusammenkopiere entsteht das hier:

Code: Alles auswählen

names <- c("Gruppe", "Alter", "Gewicht", "var1","var2","var3","var4","var5")
mittelwertePlacebo <- c(0,50,80,2,0.5,3,1,1)
mittelwerteVerum <- c(1,59,79,1,0.2,2,0.5,0.5)
bsp1 <- t(data.frame(names,mittelwertePlacebo, mittelwerteVerum))

bsp <- as.data.frame(bsp1[2:3,])
names(bsp) <- bsp1[1,]
bsp <- as.data.frame(apply(bsp, 1:2, as.numeric))
str(bsp)

library(ggplot2)
library(tidyr)
bsp.long <- pivot_longer(bsp, cols = c("var1", "var2", "var3", "var4", "var5"))

meinggplot <- function(spaltenname = "var2"){
  ggplot(subset(bsp.long, name == "var1" | name == spaltenname)) +
    geom_col(aes(y = value, x = name, fill = as.factor(Gruppe)), position = "dodge")
}

meinggplot("var3")
Und dabei entstehen solche Plots:
Rplot02.png
Rplot02.png (4.04 KiB) 1415 mal betrachtet
Entweder Du benutzt anderen Code oder wir verstehen verschiedenes untergruppierten Diagrammen. Was ist es?
see https://r-graphics.org/recipe-bar-graph-grouped-bar

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten