как использовать geom_segments для джиттера

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

Я изменил код в соответствии с предложением, теперь положение точек было изменено  положение точек изменено

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)

person Usman    schedule 10.11.2019    source источник


Ответы (1)


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

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
comment
Привет, @teunbrand, спасибо, что получил линии по всем пунктам. Теперь, когда я заметил. положение точки было изменено. в чем может быть причина этого? Я постараюсь выложить новую сюжетную картинку, чтобы вы меня увидели и предложили. - person Usman; 11.11.2019
comment
Мне не сразу понятно, как изменились позиции точек. Не могли бы вы указать, как они изменились? - person teunbrand; 11.11.2019
comment
Привет, @teunbrand, если вы видите картинку, которую я прикрепил выше, первую пару точек внизу, там более высокая точка была одной кривой, когда был применен джиттер, он был перемещен в левую сторону. - person Usman; 11.11.2019
comment
Я думаю, что они двигались только в направлении Y, но выглядят как перемещенные в направлении X относительно вашей кривой. Если точки расположены слишком далеко друг от друга, можно уменьшить дрожание. - person teunbrand; 11.11.2019
comment
Что вы подразумеваете под меньшим джиттером? Извините, я новичок в этом. вы можете порекомендовать что-нибудь почитать? - person Usman; 11.11.2019
comment
Из последнего графика в моем ответе вы можете настроить + -_ 1_ в df$jit <- runif(nrow(df), -0.05, 0.05), чтобы изменить количество дрожания. Увеличьте его, и он будет больше дрожать, сделайте его меньше, и он будет меньше дрожать. Если вам нужна подробная помощь, я предлагаю вам включить в свой вопрос воспроизводимый пример (данные + код). - person teunbrand; 12.11.2019
comment
Привет, @teunbrand, я понял, спасибо. с меньшим джиттером положение точки такое же, как и раньше. - person Usman; 12.11.2019
comment
Привет @teunbrand, моя проблема была решена, сегодня я попытался использовать один и тот же код для других данных (большие данные), поэтому через линию были подключены только 4 точки, все остальные даже не параллельны. Я отправлю еще один свежий вопрос с кодом изменения, поэтому, пожалуйста, посмотрите на него и предложите мне, где я делаю ошибку. - person Usman; 14.11.2019