как использовать geom_segments для джиттера - PullRequest
0 голосов
/ 11 ноября 2019

я связал две точки, используя geom_segments в ggplot. он хорошо работает для geom_point geom_point are linked, но когда я использую geom_jitter, он не дает мне желаемых результатов outcome using jitter. Я хочу видеть все точки с линией между ними. Не могли бы вы помочь мне, как соединить точки, используя geom_jitter? а почему точки не выглядят параллельными?

Я изменил код в соответствии с предложением, теперь позиция точек была изменена points position has been changed

ggplot() +  
geom_point(data = mydata, aes(x = lower, y = lower_p)) + 
geom_point(data = mydata, aes(x = higher, y = higher_p)) + 

geom_segment(aes(x = lower, y = ifelse(lower_p!= higher_p, NA, lower_p), xend = higher, yend = 
higher_p), data = mydata)

1 Ответ

2 голосов
/ 11 ноября 2019

Поскольку примерные данные не были опубликованы, я использую некоторые фиктивные данные для иллюстрации некоторых вещей. Давайте установим это:

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))

enter image description here

Теперь может быть полезно знать, что 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))

enter image description here

Как вы можете видеть, это выглядит ужасно, так как каждая точкадрожит независимо от любой другой точки. Мы можем приблизиться к тому, что хотим, установив начальное значение джиттера:

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))

enter image description here

Теперь левые точки обрабатываются как и ожидалось (так какзерно должно делать случайный процесс одинаково для каждой точки), но путает правильные точки. Это происходит потому, что они встряхиваются одновременно с левыми точками в качестве последующих чисел, а не параллельно левым точкам.

Единственное разумное решение, по-видимому, состоит в том, чтобы предварительно рассчитать джиттер и использовать его так, чтобы он был одинаковым для каждой точки:

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))

enter image description here

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