2017-06-29 5 views
3

Ich möchte, dass ein Etikett über jeder Box in einem Boxplot erscheint, der von ggplot2 generiert wird.Beschriftungsfelder in ggplot2 boxplot

Zum Beispiel:

#Example data 
test = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B") 
patient = c(1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3) 
result = c(5, 7, 2 ,4, 6, 7, 3, 5, 5, 6, 2 ,3) 
data <- tibble(test, patient, result) 

#Labels I want to include 
Alabs = c(1, 3, 500) 
Blabs = c(8, 16, -32) 

#Plot data 
ggplot(data, aes(x = factor(patient), y = result, color = factor(test))) + 
    geom_boxplot(outlier.shape = 1) 

Gibt das Grundstück:

enter image description here

Ich mag wäre das erste Element der Alabs über dem roten Kasten für die ersten Patienten drucken, das zweite Element von Alabs über der roten Box für den zweiten Patienten, das erste Element von Blabs über der blauen Box für den ersten Patienten usw.

Wie mache ich das?

Antwort

1

Ich würde die Etiketten einen separaten Etiketten-Datensatz machen für das Hinzufügen .

labs = tibble(test = rep(LETTERS[1:2], each = 3), 
        patient = c(1, 2, 3, 1, 2, 3), 
        labels = c(1, 3, 500, 8, 16, -32)) 

    test patient labels 
    <chr> <dbl> <dbl> 
1  A  1  1 
2  A  2  3 
3  A  3 500 
4  B  1  8 
5  B  2  16 
6  B  3 -32 

Das obige enthält alle Informationen über die X-Achse und die Facettierungsvariable. Was es fehlt, sind Informationen über den Ort des Textes auf der y-Achse. Um diese über den Kästchen zu setzen, könnten wir das Maximum für jede Faktorkombination plus einen kleinen Wert für die y-Position berechnen (während geom_text ein nützliches nudge_y-Argument hat, funktioniert es nicht während des Ausweichens).

Ich mache die Zusammenfassungen pro Gruppe über dplyr, und dann verbinden Sie die y-Position Werte zu den Etiketten-Dataset.

library(dplyr) 

labeldat = data %>% 
    group_by(test, patient) %>% 
    summarize(ypos = max(result) + .25) %>% 
    inner_join(., labs) 

Jetzt können Sie die geom_text Schicht, mit der Daten-Set von Etiketten hinzuzufügen. Um diese auf die gleiche Weise wie die Boxplots zu umgehen, verwenden Sie position_dodge. Um zu verhindern, dass Buchstaben in der Legende angezeigt werden, verwende ich show.legend = FALSE.

ggplot(data, aes(x = factor(patient), y = result, color = test)) + 
    geom_boxplot(outlier.shape = 1) + 
    geom_text(data = labeldat, aes(label = labels, y = ypos), 
       position = position_dodge(width = .75), 
       show.legend = FALSE) 

enter image description here

1

nimmt einige betrügen die Etiketten in die gleiche tibble zu erhalten:

data$labs=c(NA, 1, NA, 3, NA, 500, NA, 8, NA, 16, NA, -32) #line up the labels so each patient gets one: if you put the NAs first, labels will be at the bottom of the boxes 
data$lab_x=c(NA, 0.75, NA, 1.75, NA, 2.75, NA, 1.25, NA, 2.25, NA, 3.25) #set x position for each one 

Dann ggplot laufen:

ggplot(data, aes(x = factor(patient), y = result, color = factor(test))) + 
    geom_boxplot(outlier.shape = 1)+ 
    geom_text(aes(label=labs, x=lab_x)) 

enter image description here

Verwandte Themen