Мы можем использовать duplicated
или любую аналогичную функцию для обнаружения перекрытия, затем мы можем использовать индексирование R с помощью jitter
для выборочного применения джиттера.
Я написал его как функцию:
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)
![enter image description here](https://i.stack.imgur.com/ld5Zc.png)
Существует множество способов написать это по-другому или настроить его.Например, я думаю, что очень приятной настройкой было бы добавить необязательный аргумент для опции amount
, равной jitter()
.
. Еще одним потенциальным улучшением было бы использование измерителя для поиска (почти) дубликатов.а также точные дубликаты (тогда как duplicated
просто найдет точные дубликаты).
Последнее замечание - иногда, когда я делаю это, мне нравится использовать полупрозрачные цвета, а не jitter
.Этот вариант работает хорошо только в том случае, если число серий (type
) мало, так что вы можете делать такие вещи, как 1 серия желтым, 1 синим, и тогда их перекрытие будет зеленым (существуют решения для переполнения стека).), которые демонстрируют это, если вам интересно.