在R中标记箱形图的异常值

时间:2015-11-04 14:41:58

标签: r ggplot2 boxplot direct-labels

我有代码创建一个箱形图,在R中使用ggplot,我想用年份和战斗标记我的异常值。

这是我创建箱线图的代码

require(ggplot2)
ggplot(seabattle, aes(x=PortugesOutcome,y=RatioPort2Dutch ),xlim="OutCome", 
y="Ratio of Portuguese to Dutch/British ships") + 
geom_boxplot(outlier.size=2,outlier.colour="green") + 
stat_summary(fun.y="mean", geom = "point", shape=23, size =3, fill="pink") + 
ggtitle("Portugese Sea Battles")

有人可以帮忙吗?我知道这是正确的,我只想标记异常值。

6 个答案:

答案 0 :(得分:25)

以下是使用dplyr和内置mtcars数据集的可重现解决方案。

遍历代码:首先,创建一个函数is_outlier,如果传递给它的值是一个异常值,它将返回一个布尔值TRUE/FALSE。然后我们执行“分析/检查”并绘制数据 - 首先我们group_by我们的变量(在此示例中为cyl,在您的示例中,这将是PortugesOutcome)并且我们添加调用outlier时的变量mutate(如果drat变量是异常值[注意这对应于您示例中的RatioPort2Dutch],我们将传递{{1} }},否则我们将返回drat,以便不绘制值。最后,我们绘制结果并通过NA绘制文本值,并将审美标签等于我们的新变量;此外,我们使用geom_text来偏移文本(向右滑动一点),以便我们可以看到旁边点的值,而不是在离群点之上。

hjust

Boxplot

答案 1 :(得分:7)

这对你有用吗?

library(ggplot2)
library(data.table)

#generate some data
set.seed(123)
n=500
dat <- data.table(group=c("A","B"),value=rnorm(n))

ggplot默认将异常值定义为&gt; s&gt;来自盒子边框的1.5 * IQR。

#function that takes in vector of data and a coefficient,
#returns boolean vector if a certain point is an outlier or not
check_outlier <- function(v, coef=1.5){
  quantiles <- quantile(v,probs=c(0.25,0.75))
  IQR <- quantiles[2]-quantiles[1]
  res <- v < (quantiles[1]-coef*IQR)|v > (quantiles[2]+coef*IQR)
  return(res)
}

#apply this to our data
dat[,outlier:=check_outlier(value),by=group]
dat[,label:=ifelse(outlier,"label","")]

#plot
ggplot(dat,aes(x=group,y=value))+geom_boxplot()+geom_text(aes(label=label),hjust=-0.3)

enter image description here

答案 2 :(得分:6)

使用rownames标记离群值(基于JasonAizkalns回答)

class MyClass {
    constructor(public foo: any){}
}

const object1 = new MyClass((): void => {
    console.log('My function is to say hi. Hello!');
});
const object2 = new MyClass((n: number): void => {
    console.log('My function is echo a number. Here it is: ' + n);
});

object1.foo();      // My function is to say hi. Hello!
object2.foo(15);    // My function is echo a number. Here it is: 15

console.log(typeof object1.foo); // prints 'function'. 
                                 // I'm looking for something that prints '(): void' 
                                 // [or something comparable]

console.log(typeof object2.foo); // prints 'function'. 
                                 // I'm looking for something that prints '(number): void'

boxplot with outliers name

答案 3 :(得分:2)

与上述类似,但直接从ggplot2获得离群值,从而避免了方法中的任何潜在冲突:

# calculate boxplot object
g <- ggplot(mtcars, aes(factor(cyl), drat)) + geom_boxplot()

# get list of outliers 
out <- ggplot_build(g)[["data"]][[1]][["outliers"]]

# label list elements with factor levels
names(out) <- levels(factor(mtcars$cyl))

# convert to tidy data
tidyout <- purrr::map_df(out, tibble::as_tibble, .id = "cyl")

# plot boxplots with labels
g + geom_text(data = tidyout, aes(cyl, value, label = value), 
              hjust = -.3)

enter image description here

答案 4 :(得分:0)

您可以使用适当的ggplot调用在stat_summary本身中简单地完成此操作。

ggplot(mtcars, aes(x = factor(cyl), y = drat, fill = factor(cyl))) + 
  geom_boxplot() +
  stat_summary(
    aes(label = round(stat(y), 1)),
    geom = "text", 
    fun.y = function(y) { o <- boxplot.stats(y)$out; if(length(o) == 0) NA else o },
    hjust = -1
  )

enter image description here

答案 5 :(得分:-2)

对@JasonAizkalns解决方案进行小规模改动后,您可以使用数据框中的位置标记异常值。

.container {
    width: 100%;
    height: 75vh;
    background-image: url("http://i.stack.imgur.com/2OrtT.jpg");
    background-size: cover;
    background-repeat: no-repeat;
    background-position: 50% 50%;
}

我将数据框加载到R Studio环境中,因此我可以仔细查看异常值行中的数据。