выборочный джиттер geom_points - PullRequest
0 голосов
/ 22 октября 2018

У меня есть 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)

enter image description here

Здесь мы видим, что для точки x=1 and y=a1 значение type A равносидя под type B, но в идеале я хочу, чтобы Type B сдвигался по вертикали на бит.

Если я использую джиттер, все объекты смещаются, включая точки, которые не перекрываются.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Просто еще один способ с преобразованными 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))

enter image description here

Примечание: я предполагаю, что y является фактором, как в вашем примере,В противном случае вы можете преобразовать y из символа в фактор с помощью data$y <- factor(data$y).

0 голосов
/ 22 октября 2018

Мы можем использовать 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

Существует множество способов написать это по-другому или настроить его.Например, я думаю, что очень приятной настройкой было бы добавить необязательный аргумент для опции amount, равной jitter().

. Еще одним потенциальным улучшением было бы использование измерителя для поиска (почти) дубликатов.а также точные дубликаты (тогда как duplicated просто найдет точные дубликаты).

Последнее замечание - иногда, когда я делаю это, мне нравится использовать полупрозрачные цвета, а не jitter.Этот вариант работает хорошо только в том случае, если число серий (type) мало, так что вы можете делать такие вещи, как 1 серия желтым, 1 синим, и тогда их перекрытие будет зеленым (существуют решения для переполнения стека).), которые демонстрируют это, если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...