Маркировка выпадающего в прямоугольник - PullRequest
5 голосов
/ 28 октября 2011

Я хочу нарисовать прямоугольники в R и добавить имена к выбросам.До сих пор я нашел это решение .

Эта функция предоставляет все необходимые мне функции, но неправильно шифрует этикетки.В следующем примере он помечает выброс как «u» вместо «o»:

library(plyr)
library(TeachingDemos)
source("http://www.r-statistics.com/wp-content/uploads/2011/01/boxplot-with-outlier-label-r.txt") # Load the function
set.seed(1500)
y <- rnorm(20)
x1 <- sample(letters[1:2], 20,T)
lab_y <- sample(letters, 20)
# plot a boxplot with interactions:
boxplot.with.outlier.label(y~x1, lab_y)

Знаете ли вы какое-либо решение?Библиотека ggplot2 супер хороша, но не предоставляет такой функциональности (насколько я знаю).Моя альтернатива заключается в использовании функции text () и извлечении информации о выбросах из объекта boxplot.Тем не менее, как это метки могут перекрываться.

Большое спасибо: -)

Ответы [ 2 ]

6 голосов
/ 29 октября 2011

Я посмотрел на это с помощью debug(boxplot.with.outlier.label), и ... оказалось, что в функции есть bug.

Ошибка возникает в строке 125, где data.frame DATA построен из x, y и label_name.

Ранее x и y были переупорядочены, а lab_y - нет.Когда предоставленное значение x (ваш x1) само по себе уже не в порядке, вы получите тот тип путаницы, с которым вы столкнулись.

В качестве немедленного решения вы можете предварительно заказатьx значений, подобных этому (или сделать что-то более изящное)

df <- data.frame(y, x1, lab_y, stringsAsFactors=FALSE)
df <- df[order(df$x1), ]
# Needed since lab_y is not searched for in data (though it probably should be)
lab_y <- df$lab_y  

boxplot.with.outlier.label(y~x1, lab_y, data=df)

Boxplot produced by procedure described above

1 голос
/ 28 октября 2011

Размещение интеллектуальной метки *1001* - это отдельная проблема, обсуждаемая здесь или здесь .Там нет окончательного и идеального решения, поэтому вам просто нужно выбрать его там.

Таким образом, вы бы перелистали обычную коробку с метками, как показано ниже:

set.seed(1501)
y <- c(4, 0, 7, -5, rnorm(16))
x1 <- c("a", "a", "b", "b", sample(letters[1:2], 16, T))
lab_y <- sample(letters, 20)

bx <- boxplot(y~x1)

out_lab <- c()
for (i in seq(bx$out)) { 
    out_lab[i] <- lab_y[which(y == bx$out[i])[1]]
}

identify(bx$group, bx$out, labels = out_lab, cex = 0.7)

Затем, во время identify()работает, вы просто нажимаете на позицию, где вы хотите метку, как описано здесь .Когда закончите, просто нажмите «СТОП».Обратите внимание, что каждый выброс может иметь более одной метки!В своем решении я просто выбрал первое !!

PS: мне стыдно за цикл for, но я не знаю, как его векторизовать - не стесняйтесь публиковать улучшения.

РЕДАКТИРОВАТЬ: вдохновленный ссылкой Федерико Теперь я вижу, что это может быть сделано гораздо проще!Только эти 2 команды:

boxplot(y~x1)
identify(as.integer(as.factor(x1)), y, labels = lab_y, cex = 0.7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...