Seite 1 von 1

ggplot (barplot) & Tukey-Test

Verfasst: Sa Mär 16, 2019 1:07 am
von flip_0207
Hallo

Ich habe folgendes Problem:

Die Ergebnisse einer ANOVA und des Tukey-Tests möchte ich gerne mit ggplot grafisch darstellen. Grundsätzlich schaffe ich es, ein Balkendiagramm mit Standardabweichung zu erstellen und die beiden Tests durchzuführen.
Mir fehlt im Diagramm jedoch noch die Signifikanzentscheidung anhand der Buchstaben, die über dem jeweiligen Balken stehen sollen.

Habe dazu mal ein kleines Beispiel vorbereitet:

Code: Alles auswählen

library(tidyverse)
library(agricolae)

Beispiel <-data.frame(Variante=factor(c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)),
                      Messwert=c(64,87,54,98,14,5,8,9,9,2,12,15,7,8,7))

AOV_Beispiel <- aov(Messwert~Variante, data = Beispiel)
Tukey_Beispiel <-HSD.test(AOV_Beispiel,"Variante",
                              group = TRUE,
                              console = TRUE)
HSD.test gibt mir für den Beispieldatensatz folgendes heraus:

Code: Alles auswählen

  Messwert groups
1     63.4      a
3      9.8      b
2      6.6      b
Damit hätte ich also zwei Gruppen "a" und "b".

Gibt es eine einfache, automatische und möglichst elegante Lösung, diese gängige Darstellungsweise mit ggplot zu erreichen?

Gruß
Flip

Re: ggplot (barplot) & Tukey-Test

Verfasst: Sa Mär 16, 2019 9:52 pm
von EDi
Was hast du denn probiert?

Hier ein Beispiel mit emmeans (ich mag agricolae nicht), das du sicherlich anpassen kannst.

Code: Alles auswählen

library("emmeans")
library("ggplot2")
Beispiel <-data.frame(Variante=factor(c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)),
                      Messwert=c(64,87,54,98,14,5,8,9,9,2,12,15,7,8,7))
mod <- lm(Messwert~Variante, data = Beispiel)
emm <- emmeans(mod, ~Variante)
sig_lett <- CLD(emm, adjust = "tukey", Letters = letters)
df <- data.frame(sig_lett)
df

ggplot(data = df, aes(x = Variante)) +
  geom_pointrange(aes(y = emmean, ymin = lower.CL, ymax = upper.CL)) +
  geom_text(aes(y = upper.CL, label = trimws(.group)), vjust = -1)

Re: ggplot (barplot) & Tukey-Test

Verfasst: So Mär 17, 2019 3:01 pm
von flip_0207
Danke, das werde ich mal versuchen.
Ideal wäre es mit agricolae, das package nutze ich recht viel für Statistik.

Re: ggplot (barplot) & Tukey-Test

Verfasst: Sa Nov 23, 2019 12:18 pm
von Dafmen
Hallo,

auch wen es nicht mein Thread ist, hat mir deine Lösung sehr geholfen. Die Adaption auf meinen Datensatz funktionierte tadellos.
Perfekt.

Danke und Gruß,
Sebastian

Re: ggplot (barplot) & Tukey-Test

Verfasst: Mo Jan 20, 2020 10:51 am
von flip_0207
Da ich mitterweile eine gute Lösung für das Problem gefunden habe, hier mal ein Beispiel (Rohdaten sind im Dateianhang):

Code: Alles auswählen

library(tidyverse)
library(agricolae)

Rohdaten <- read.csv2("Rohdaten_ANOVA_Tukey.csv")

#Thema erstellen

Thema <- theme(panel.background = element_rect(fill = "white"),
                  axis.line = element_line())

Farben_Art <- c("Zuckerrübe"="darkgreen", "Winterweizen"="blue", "Ackerbohne"="red4")

#ANOVA
AOV_Ertrag <- aov(Ertrag ~ Art, data = Rohdaten)

#Tukey-Test
Tukey_Ertrag <-HSD.test(AOV_Ertrag, "Art",
                              group = TRUE,
                              console = TRUE)

#Gruppen aus Tukey herausziehen

Gruppen <- Tukey_Ertrag$groups
Gruppen$Art <- row.names(Gruppen)


#Tabellen verschneiden

Grafik <- full_join(Rohdaten, Gruppen[,c("Art","groups")])

#Gruppieren

Grafik<-Grafik %>%
  group_by(Art, groups) %>%
  summarise("Ertrag"=mean(Ertrag))

#Grafik erstellen

ggplot(Grafik, aes(x=Art, y=Ertrag, fill=Art)) +
  geom_bar(position=position_dodge(), stat="identity",
           size=0.3)+
  xlab("Art") +
  ylab("Ertrag [dt/ha]") +
  geom_text(aes(label=groups), position=position_dodge2(width=0.9,preserve="single"), 
            size=4 , vjust=-1.5 ,hjust=0.5)+
  scale_y_continuous(limits = c(0,1000), breaks = c(0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000),
                     labels = c("0","100","200","300","400","500","600","700","800","900","1000"))+
  theme_classic()+
  scale_color_manual(values = Farben_Art, aesthetics = "fill")+
  Thema+
  theme(axis.text.x=element_blank(), 
        axis.ticks.x=element_blank())