Поскольку никаких примеров данных не было опубликовано, я использую фиктивные данные, чтобы проиллюстрировать некоторые вещи. Давайте настроим это:
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))
person
teunbrand
schedule
10.11.2019