Поскольку примерные данные не были опубликованы, я использую некоторые фиктивные данные для иллюстрации некоторых вещей. Давайте установим это:
df <- data.frame(x = c(1,1,1,2,2),
xend = c(2,2,2,3,3),
y = c(1,1,1,2,2),
yend = c(1,1,1,2,2))
И если мы построим этот график так же, как вы опубликовали, мы получим следующий график, на котором точки переопределяются 2-3 раза:
ggplot(df) +
geom_point(aes(x, y), colour = "red") +
geom_point(aes(xend, yend), colour = "dodgerblue") +
geom_segment(aes(x = x, y = y, xend = xend, yend = yend))
Теперь может быть полезно знать, что geom_jitter()
является сокращением для geom_point(position = "jitter")
. Как и большинство позиций, вы можете дать position_jitter()
аргументы о том, как вы хотите, чтобы джиттер происходил. Например, мы можем захотеть дрожать только в направлении y:
ggplot(df) +
geom_point(aes(x, y), colour = "red",
position = position_jitter(height = 0.1, width = 0)) +
geom_point(aes(xend, yend), colour = "dodgerblue",
position = position_jitter(height = 0.1, width = 0)) +
geom_segment(aes(x = x, y = y, xend = xend, yend = yend),
position = position_jitter(height = 0.1, width = 0))
Как вы можете видеть, это выглядит ужасно, так как каждая точкадрожит независимо от любой другой точки. Мы можем приблизиться к тому, что хотим, установив начальное значение джиттера:
ggplot(df) +
geom_point(aes(x, y), colour = "red",
position = position_jitter(height = 0.1, width = 0, seed = 1)) +
geom_point(aes(xend, yend), colour = "dodgerblue",
position = position_jitter(height = 0.1, width = 0, seed = 1)) +
geom_segment(aes(x = x, y = y, xend = xend, yend = yend),
position = position_jitter(height = 0.1, width = 0, seed = 1))
Теперь левые точки обрабатываются как и ожидалось (так какзерно должно делать случайный процесс одинаково для каждой точки), но путает правильные точки. Это происходит потому, что они встряхиваются одновременно с левыми точками в качестве последующих чисел, а не параллельно левым точкам.
Единственное разумное решение, по-видимому, состоит в том, чтобы предварительно рассчитать джиттер и использовать его так, чтобы он был одинаковым для каждой точки:
set.seed(0)
df$jit <- runif(nrow(df), -0.05, 0.05)
ggplot(df) +
geom_point(aes(x, y + jit), colour = "red") +
geom_point(aes(xend, yend + jit), colour = "dodgerblue") +
geom_segment(aes(x = x, y = y + jit, xend = xend, yend = yend + jit))