4

我有一个ggplot,其中一些点与其他一些点重叠。我想知道是否有办法将这些点放在另一个之上。就我而言,最多有 2 个点重叠。

x=c(1,1,2,3,4,4)
y=c('a1','a1','a2','a3','a4','a4')
type = c('A','B','C','A','B','C')

data = as.data.frame(cbind(x,y,type))

ggplot() + geom_point(data = data, aes(x=x,y=y, color = type, fill = type), size = 2, shape = 25)

在此处输入图像描述

在这里,我们看到点x=1 and y=a1位于type A下方type B,但理想情况下我希望Type B垂直移动一点。

如果我使用抖动,每件事都会发生位移,包括没有重叠的点。

4

2 回答 2

6

我们可以使用duplicated或任何类似的函数来检测重叠,然后我们可以使用 R indexing withjitter来选择性地应用抖动。

我把它写成一个函数:

selective_jitter <- function(x, # x = x co-ordinate
                             y, # y = y co-ordinate 
                             g  # g = group
                             ){
  x <- as.numeric(x)
  y <- as.numeric(y)
  a <- cbind(x, y)
  a[duplicated(a)] <- jitter(a[duplicated(a)], amount = .15) # amount could be made a parameter

  final <- cbind(a, g)
  return(final)
}


data <- as.data.frame(selective_jitter(data$x, data$y, data$type))

ggplot() + geom_point(data = data, aes(x=x,y=y, color = g, fill = type), size = 2, shape = 25)

在此处输入图像描述

有很多方法可以以不同的方式编写或调整它。例如,我认为一个非常好的调整是为amount选项添加一个可选参数jitter()

另一个潜在的改进是使用卡尺来寻找(接近)重复以及精确的重复(而duplicated只会找到精确的重复)。

最后一点 - 有时当我这样做时,我喜欢使用半透明颜色而不是jitter. 这种变化只有在系列type(如果你有兴趣。

于 2018-10-22T13:31:47.353 回答
2

只是转换y值的另一种方式。基本思想与 Hack-R 类似:

library(data.table)
setDT(data)
data[, y2 := as.numeric(y) + 0.2* (rowid(y) - 1)]

ggplot() +
    geom_point(data = data,
               aes(x=x,y=y2, color = type, fill = type),
               size = 2, shape = 25) +
    scale_y_continuous(breaks = seq_len(uniqueN(data$y)), labels = levels(data$y))

在此处输入图像描述

注意:我假设y是您的示例中的一个因素。否则,您可以使用 将y字符转换为因子data$y <- factor(data$y)

于 2018-10-22T13:44:55.433 回答