2016-03-30 12 views
1

Ich versuche ein Boxplot zu erstellen, in dem die Ausreißer nach einer dritten Variablen und nicht nach Zeilennamen benannt werden.Boxplot-Label-Ausreißer nach der dritten Variablen

Meine Daten sieht wie folgt aus: (jetzt bearbeitet, um mehrere Länder und Sektoren als Faktor Variable enthalten)

country <- c(rep(LETTERS[1:5],2)) 
sector <- rep(c("one", "two"),5) 
set.seed(200) 
value <- round(rnorm(10),2) 
dat <- data.frame(country,sector,value) 
dat 

    country sector value 
1  A one 0.08 
2  B two 0.23 
3  C one 0.43 
4  D two 0.56 
5  E one 0.06 
6  A two -0.11 
7  B one -1.02 
8  C two -0.30 
9  D one 0.17 

10 E zwei 1,42

Ohne die Etiketten der boxplot ist wie folgt:

Ich möchte, dass die Beschriftungen der Ausreißerpunkte die Werte für das variable Land widerspiegeln.

fand ich eine ähnliche Frage hier: Labeling outliers on boxplot in R und ich versuche, den Code anzupassen, wie folgt:

bxpdat <- boxplot(value ~ sector, data=dat) 
text(bxpdat$group+0.2,           
bxpdat$out,             
dat$country[which(dat$value == bxpdat$out, arr.ind=TRUE)[, 1]]) 

Allerdings scheine ich etwas falsch machen, weil dies nicht funktioniert. Ich würde einen Vorschlag sehr schätzen, wie man diesen Code repariert,

danke im Voraus!

+0

Hallo, vielen Dank für Ihre Antwort! Es funktioniert mit den Beispieldaten, die ich hier bereitgestellt habe, aber auf meinen echten Daten hat es nicht funktioniert ... vielleicht liegt das daran, dass die Originaldaten viel mehr Länder haben. Wenn ich beispielsweise versuche, das variable Land als 'country <- c (rep (LETTERS [1: 5], 2))' zu definieren, schreibt es für beide Fälle das gleiche Label ... – ZMacarozzi

+0

hast du ausprobiert @MichaelChirico Lösung? das sollte auch an deinen realen Daten arbeiten – Cath

Antwort

2

leichte Anpassung:

x <- boxplot(value ~ sector, data=dat) 

text(x$group, x$out, 
    labels=subset(dat, sector %in% x$group & 
        value %in% x$out)$country, pos=4) 

Dies ist keine große allgemeine Lösung, da die subset passende versehentlich andere Punkte treffen könnten. Dies funktioniert besser, aber ich bin mir nicht sicher, wie es geht in base:

library(data.table); setDT(dat, key = c("sector", "value")) 

dat[ , { 
    x <- boxplot(value ~ sector, data=dat) 
    with(x, text(group, out, .SD[.(group, out), country], pos = 4))}] 
+0

@Cath mit verschiedenen Werten des Landes, meinst du? – MichaelChirico

+1

Passen Sie in diesem Fall an '.SD [. (Group, out), einfügen (Land, collapse =", "), durch =. (Sektor, Wert)]', aber wie Sie erwähnt haben, ist dies unwahrscheinlich – MichaelChirico

+0

danke Vieles, der Basisvorschlag arbeitet mit den Beispieldaten, selbst wenn ich mit mehr Ländern neu definiere. Ich werde jetzt den ursprünglichen Datensatz anprobieren. Verstehe ich richtig, dass es ein Problem gibt, wenn es die gleichen Werte gibt, aber sie sind nicht Ausreißer zum Beispiel in anderen Sektoren? Vermeidet die data.table-Lösung das? – ZMacarozzi

Verwandte Themen