仅当计数高于阈值时才绘制直方图箱

时间:2019-07-19 14:05:09

标签: r histogram

假设我有一个像这样的向量:

mydata = c(1, 3, 4, 5, 6, 7, 8, 9, 10)

五个中断的直方图如下所示:

h = hist(mydata, breaks=5)

enter image description here

如何仅绘制频率计数高于阈值的垃圾箱?在这种情况下,任何大于1的计数。

我想得出以下直方图:

enter image description here

我知道我可以使用h$countsh$breaks来访问计数和中断,但是我想不出一种简单的方法来使用它们来过滤出某些垃圾箱。

3 个答案:

答案 0 :(得分:1)

在这种特殊情况下,您可以这样操作,但不能将其推广到连续的垃圾箱和直方图的左端。

f <- -which(h$counts < 2)
h[1:4] <- lapply(h[1:4], "[", f)
h
# $breaks
# [1]  2  4  6  8 10
# 
# $counts
# [1] 2 2 2 2
# 
# $density
# [1] 0.1111111 0.1111111 0.1111111 0.1111111
# 
# $mids
# [1] 3 5 7 9
# 
# $xname
# [1] "mydata"
# 
# $equidist
# [1] TRUE
# 
# attr(,"class")
# [1] "histogram"

如果您要涵盖bin两端的情况,则必须增加一些代码复杂性。

mydata <- c(1, 3, 4, 5, 6, 7, 8, 9, 10, 12)
h <- hist(mydata, breaks=6)

f1 <- h$counts < 2
f2 <- rle(f1)
if (length(f2$lengths) == 3) {
    f2$lengths[2] <- f2$lengths[2] + 1
    f2 <- which(inverse.rle(f2))
} else {
    f2 <- which(f1)
}

h[2:4] <- lapply(h[2:4], "[", !f1)
h[[1]] <- h[[1]][-f2]

plot(h)

enter image description here

enter image description here

答案 1 :(得分:0)

您可以直接操纵hist返回的对象并对其进行绘制:

h$counts[ h$counts < 2 ] <- 0
plot(h)

答案 2 :(得分:0)

我假设如果低于阈值的存储桶位于直方图的中间,则只想删除该存储桶。

鉴于此,只需将轴限制调整为第一个和最后一个非零存储区即可。

到目前为止,初始直方图

mydata2 <- c(1, 3, 4, 5, 6, 7, 3, 9, 10, 12)

h2 <- hist(mydata2, breaks=6)

before

它会像这样变

h2$counts[ h2$counts < 2] <- 0
xmin <- h2$breaks[min(which(h2$counts != 0))] 
xmax <- h2$breaks[max(which(h2$counts != 0)) + 1] 
plot(h2, xlim = c(xmin, xmax))

after

如果要将中间存储桶合并到其他频率,则变得更加复杂,并且取决于要使用的合并规则。