Boxplot mit Metrischer x-achsen Skalierung

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

Antworten
R_beginner
Beiträge: 12
Registriert: Mo Jun 15, 2020 10:42 am

Boxplot mit Metrischer x-achsen Skalierung

Beitrag von R_beginner »

Hallo zusammen,
in meinem aktuellen Projekt messe ich eine Dosis-Wirkungs-Beziehung.
Im Code habe ich einen Beispieldatensatz erstellt der meine Ergebnisse ungefähr abbildet.
Jetzt komme ich zu meiner Frage.
Ich würde gerne einen Boxplot mit einer "metrischen" x Achse erstellen. In diesem Plot würde ich dann gerne die Mediane mit einer Linie verbinden. Wenn nun die x Achse des Boxplots nicht kategorial sondern metrisch skaliert wäre würde die Linie die durch die Mediane verläuft eine Sättigungskurve ergeben.
Ist so eine Darstellung mit R möglich und wenn Ja Wie?
Für eure Hilfe wäre ich sehr Dankbar!
Viele Grüße
Robert

library(ggplot2)
library(ggpubr)
library(tidyr)

#Beispieldatensatz
set.seed(2022)
d_10 <- rnorm(n=50,mean=50,sd=12)
d_15 <- rnorm(n=50,mean=70,sd=10)
d_20 <- rnorm(n=50,mean=90,sd=8)
d_30 <- rnorm(n=50,mean=112,sd=6)
d_40 <- rnorm(n=50,mean=120,sd=6)

data <- data.frame(d_10,d_15,d_20,d_30,d_40)
tidydata <- pivot_longer(data,cols = c("d_10","d_15","d_20","d_30", "d_40")
,names_to = "Dosis",values_to = "Readout")
stable <- desc_statby(tidydata, measure.var = "Readout",grps = "Dosis")

#Boxplot
plot1 <- ggplot(tidydata, aes(x = Dosis, y = Readout)) +
geom_boxplot(outlier.color = NA) +
geom_jitter(aes(), width =.2) +
xlab("Dosis") + ylab("Readout") + ylim(0, 150)
plot1

#Lineplot
x <- c(10,15,20,30,40)#xAchse
plot2 <- ggplot(stable,aes(x=x,y=median)) +
geom_point()+ geom_line()+
xlab("Dosis") + ylab("Readout") +
ylim(0, 150)
plot2
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Boxplot mit Metrischer x-achsen Skalierung

Beitrag von bigben »

Hallo,

suchst Du sowas?

Code: Alles auswählen

library(ggplot2)
library(tidyr)

#Beispieldatensatz
set.seed(2022)
d_10 <- rnorm(n=50,mean=50,sd=12)
d_15 <- rnorm(n=50,mean=70,sd=10)
d_20 <- rnorm(n=50,mean=90,sd=8)
d_30 <- rnorm(n=50,mean=112,sd=6)
d_40 <- rnorm(n=50,mean=120,sd=6)

data <- data.frame(d_10,d_15,d_20,d_30,d_40)
tidydata <- pivot_longer(data,cols = c("d_10","d_15","d_20","d_30", "d_40")
                         ,names_to = "Dosis",values_to = "Readout")
tidydata$Dosis.metrisch <- rep(c(10, 15, 20, 30, 40), 50) # woher soll R wissen, welcher metrische Wert hinter "d_10" steht?
mediane <- data.frame(x = c(10, 15, 20, 30, 40),          # Mediane berechnen außerhalb von Grafikfunkionen. Dann hat man sie auch für später
                      y = tapply(tidydata$Readout, tidydata$Dosis, median))

plot1 <- ggplot(tidydata) +
  geom_boxplot(aes(x = Dosis.metrisch, y = Readout, group = Dosis)) +   # wir setzen x auf den metrischen und group auf den factor Wert
  geom_jitter(aes(x = Dosis.metrisch, y = Readout), width =.2) +
  geom_line(aes(x = x, y = y), data = mediane, size = 4, alpha = .4, col = "violet") +
  xlab("Dosis") + ylab("Readout") + ylim(0, 150) +
  theme_bw()
plot1
Zusatztipp: Ich persönlich mag als Alternative zu geom_jitter gerne geom_beeswarm aus dem Paket ggbeeswarm wie in

Code: Alles auswählen

library(ggbeeswarm)
plot2 <- ggplot(tidydata) +
  geom_boxplot(aes(x = Dosis.metrisch, y = Readout, group = Dosis)) +
  geom_beeswarm(aes(x = Dosis.metrisch, y = Readout), alpha = .2) +
  geom_line(aes(x = x, y = y), data = mediane, size = 2, alpha = .4, col = "blue") +  # beachte das data Argument, mit dem wir einen anderen Dataframe anwenden als den in ggplot() genannten
  xlab("Dosis") + ylab("Readout") + ylim(0, 150) +
  theme_bw()
plot2
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
R_beginner
Beiträge: 12
Registriert: Mo Jun 15, 2020 10:42 am

Re: Boxplot mit Metrischer x-achsen Skalierung

Beitrag von R_beginner »

Lieber Bernhard,

genau das habe ich gesucht!
Ich danke dir sehr für deine Mühe und die Lösung die du mir geliefert hast!

VG
Robert
Antworten