2016-12-16 4 views
0

ich eine sehr einfache boxplot wie dies in R darstellen möchten:ggplot: rescale Achse (log) und Schnittachse

gewünschte Diagramm

enter image description here

Es ist ein Log-Link (Gamma verteilt : jh_conc ist eine variable Hormonkonzentration) verallgemeinerten linearen Modells eines kontinuierlichen abhängige Variable (jh_conc) für eine kategorische Variable Gruppierung (Gruppe: type of bee)

My-Skript, das I alre ady haben, ist:

enter image description here

Meine Frage ist: was (geom) Erweiterungen kann ich die y-Achse und rescale sie anders spalten

> jh=read.csv("data_jh_titer.csv",header=T) 
> jh 
      group  jh_conc 
1   Queens 6.38542714 
2   Queens 11.22512563 
3   Queens 7.74472362 
4   Queens 11.56834171 
5   Queens 3.74020100 
6 Virgin Queens 0.06080402 
7 Virgin Queens 0.12663317 
8 Virgin Queens 0.08090452 
9 Virgin Queens 0.04422111 
10 Virgin Queens 0.14673367 
11  Workers 0.03417085 
12  Workers 0.02449749 
13  Workers 0.02927136 
14  Workers 0.01648241 
15  Workers 0.02150754 

fit1=glm(jh_conc~group,family=Gamma(link=log), data=jh) 

ggplot(fit, aes(group, jh_conc))+ 
     geom_boxplot(aes(fill=group))+ 
     coord_trans(y="log") 

die resultierende Handlung wie folgt aussieht? Auch wie füge ich die schwarzen Kreise (Mittelwerte; die auf einer logarithmischen Skala berechnet und dann auf die ursprüngliche Skala zurücktransformiert werden) horizontale Linien hinzu, die Signifikanzniveaus sind, basierend auf post-hoc-Tests, die mit log-transformierten Daten durchgeführt wurden: **: p < 0,01 , ***: p < 0,001?

Antwort

0

Sie können keine defekte numerische Achse in ggplot2 per Entwurf erstellen, hauptsächlich weil sie die dargestellten Daten/Unterschiede visuell verzerrt und als irreführend angesehen wird.

Sie können jedoch scale_log10() + annotation_logticks() verwenden, um Daten über einen breiten Bereich von Werten zu kondensieren oder besser heteroskedastische Daten anzuzeigen. Sie können auch annotate verwenden, um Ihre p-Wert-Darstellungssterne und -balken zu erstellen.

auch leicht Sie Informationen aus einem Modell greifen kann es benannte Attribute verwenden, hier kümmern wir uns um fit$coef:

# make a zero intercept version for easy plotting 
fit2 <- glm(jh_conc ~ 0 + group, family = Gamma(link = log), data = jh) 
# extract relevant group means and use exp() to scale back 
means <- data.frame(group = gsub("group", "",names(fit2$coef)), means = exp(fit2$coef)) 

ggplot(fit, aes(group, jh_conc)) + 
    geom_boxplot(aes(fill=group)) + 
    # plot the circles from the model extraction (means) 
    geom_point(data = means, aes(y = means),size = 4, shape = 21, color = "black", fill = NA) + 
    # use this instead of coord_trans 
    scale_y_log10() + annotation_logticks(sides = "l") + 
    # use annotate "segment" to draw the horizontal lines 
    annotate("segment", x = 1, xend = 2, y = 15, yend = 15) + 
    # use annotate "text" to add your pvalue *'s 
    annotate("text", x = 1.5, y = 15.5, label = "**", size = 4) + 
    annotate("segment", x = 1, xend = 3, y = 20, yend = 20) + 
    annotate("text", x = 2, y = 20.5, label = "***", size = 4) + 
    annotate("segment", x = 2, xend = 3, y = .2, yend = .2) + 
    annotate("text", x = 2.5, y = .25, label = "**", size = 4) 

enter image description here

Verwandte Themen