2016-04-13 4 views
0

Arbeiten mit der folgenden Teilmenge einer viel größeren Datenmenge, um anzuzeigen,Symbol oben auf ggplot2 Boxplots hinzufügen Wert der Variablen

ex <- structure(list(transect_id = c(1L, 1L, 1L, 1L, 1L, 15L, 15L, 
15L, 15L, 15L, 15L), number_f = c(2L, 2L, 2L, 2L, 2L, 0L, 0L, 
0L, 0L, 0L, 0L), years_f = c(1L, 1L, 1L, 1L, 1L, 6L, 6L, 6L, 
6L, 6L, 6L), b = c(5.036625862, 6.468666553, 8.028989792, 4.168409348, 
5.790089607, 10.67796993, 9.371051788, 10.54364777, 6.904324532, 
7.203606129, 9.1611166)), .Names = c("transect_id", "number_f", 
"years_f", "b"), class = "data.frame", row.names = c(1L, 2L, 
3L, 4L, 5L, 2045L, 2046L, 2047L, 2048L, 2049L, 2050L)) 

Ich habe die Verteilungen von „b“ für jede der Gruppen angegeben, aufgetragen durch „transect_id“ und haben sie durch „Zahl_Misserfolge“ gefärbt, die ich hier tun:

ggplot(aes(x=reorder(transect_id, b, FUN=median), y=b), data=ex) + geom_boxplot(aes(fill=as.factor(number_f))) + xlab('Transect ID') 

enter image description here

Was ich für jeden tun müssen von Die "transect_id" -Gruppen sind Stapelsymbole - Sternchen oder ein anderes Symbol - oben auf jedem Boxplot, um einen Hinweis auf den Wert von "years_f" zu geben, der jeder "transect_id" entspricht. In der folgenden Datenteilmenge beträgt "years_f" 1 und 6 für transect_ids 1 bzw. 15. Ich würde gerne so etwas sehen, das ich manuell verspottete.

enter image description here

Denken Sie auch daran, dass der Datensatz ich arbeiten bin sehr groß, so brauche ich werde einige Schleife oder eine andere Art und Weise zu verwenden, um dies automatisch zu tun. Bitte beachten Sie, dass ich andere Ideen für bessere Möglichkeiten, den Wert von "years_f" anzugeben, die die Figur nicht so sehr überfordern, als all diese gestapelten Symbole, die insbesondere bei größeren Werten von "years_f" ein Problem darstellen, durchaus begrüßen werde.

Antwort

1

Try

annotate('text', x = c(1, 2), y = 3, label = paste0('Year_F =', unique(ex$years_f))) 

bis zum Ende Ihrer Handlung wie so hinzufügen:

ggplot(aes(x=reorder(transect_id, b, FUN=median), y=b), data=ex) + 
    geom_boxplot(aes(fill=as.factor(number_f))) + xlab('Transect ID')+ 
    annotate('text', x = c(1, 2), y = 3, label = paste0('Year_F =', unique(ex$years_f))) 

enter image description here

Um es auf einer größeren Datenmenge verwenden Sie müssten bearbeiten die x und y Argument, aber das könnte eine gute Alternative sein. Eine Möglichkeit für die y Koordinate könnte etwas wie 0.9 * min(ex$b) sein.

bearbeiten Als Antwort auf Ihren Kommentar:

Sie zuerst, wie viele Ebenen gibt es von transect_id dann angeben x

len.levels <- length(levels(as.factor(ex$transect_id))) 

zählen konnte, könnten Sie eine Übersichtstabelle der uniqe years_f erstellen variabel durch transect_id:

sum.table <- aggregate(years_f~reorder(ex$transect_id, ex$b, median), 
         data = ex, FUN = unique) 

    reorder(ex$transect_id, ex$b, median) years_f 
1          1  1 
2         15  6 

und plotten Sie dann wie folgt:

ggplot(aes(x=reorder(transect_id, b, FUN=median), y=b), data=ex) + 
    geom_boxplot(aes(fill=as.factor(number_f))) + xlab('Transect ID')+ 
    annotate('text', x = 1:len.levels, y = .9 * min(ex$b), 
      label = paste0('Year_F =', sum.table[,2])) 
+0

Danke für den Vorschlag, aber ich bin nicht ganz sicher, wie Sie Ihren Code an den größeren Dataset anpassen, da die years_f Werte sich wiederholen. Für die 50 Transekte könnte es also 12 eindeutige Werte von years_of geben. Wie könnte ich das Argument x so ändern, dass ich es nicht manuell angeben muss? – SilvanD

+0

Überprüfen Sie meine Bearbeitung, ist es in Ordnung? Planen Sie auch 50 Boxplots? – bouncyball

+0

Das funktioniert gut - danke, dass Sie diese Änderungen vorgenommen haben. Ja, ich plane 50 Boxplots. Ich werde immer noch versuchen herauszufinden, wie ich meine ursprüngliche Vision von gestapelten Sternen verwirklichen kann, aber das ist eine ausgezeichnete Alternative. Vielen Dank! – SilvanD

Verwandte Themen