Линии, соединяющие точки дрожания - уклонение несколькими группами

Я пытаюсь соединить точки дрожания между измерениями двумя разными методами (measure) на оси x. Эти измерения связаны друг с другом пробандами (a), которых можно разделить на две основные группы: пациенты (pat) и контроли (ctr ), у меня df такой:

set.seed(1)
df <- data.frame(a = rep(paste0("id", "_", 1:20), each = 2),
                 value = sample(1:10, 40, rep = TRUE),
                 measure = rep(c("a", "b"), 20), group = rep(c("pat", "ctr"), each = 2,10))

Я пытался

library(ggplot2)
ggplot(df,aes(measure, value, fill = group)) + 
  geom_point(position = position_jitterdodge(jitter.width = 0.1, jitter.height = 0.1,
                                             dodge.width = 0.75), shape = 1) +
  geom_line(aes(group = a), position = position_dodge(0.75))

Создано 13 января 2020 г. пакетом REPEX (v0.3.0)

Я использовал эстетику fill, чтобы отделить дрожащие точки из обеих групп (pat и ctr). Я понял, что когда я помещаю group = a эстетику в главный вызов ggplot, он не так хорошо разделяется, но, кажется, лучше связан с точками.

Мой вопрос: есть ли способ лучше соединить линии с (дрожащими) точками, но сохраняя разделение на две основные группы, ctr и pat?

Большое спасибо.


person tjebo    schedule 20.06.2017    source источник
comment
Этот вопрос кажется тесно связанным. Один из ответов показывает, как вручную дрожать точки.   -  person aosmith    schedule 20.06.2017
comment
Спасибо за быстрый ответ. К сожалению, оба ответа из этого предложенного сообщения не работают для моей проблемы, поскольку оба ответа не разделяют строки на две основные группы (ctr и pat)   -  person tjebo    schedule 20.06.2017
comment
В этом ответе показан другой подход через interaction. Обратной стороной является то, что он меняет ваши оси в вашем конкретном случае. Единственный другой вариант, о котором я могу думать, - это ручное уклонение и дрожание данных.   -  person aosmith    schedule 20.06.2017


Ответы (1)


Большая проблема, с которой вы столкнулись, заключается в том, что вы уклоняетесь от очков только group, но и от линий уклоняетесь также a.

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

df = transform(df, dmeasure = ifelse(group == "ctr", 
                                     as.numeric(measure) - .25,
                                     as.numeric(measure) + .25 ) )

Затем вы можете построить график с measure в качестве оси x, но затем использовать "уклоненную" переменную в качестве переменной оси x в geom_point и geom_line.

ggplot(df, aes(x = measure, y = value) ) +
     geom_blank() +
     geom_point( aes(x = dmeasure), shape = 1 ) +
     geom_line( aes(group = a, x = dmeasure) )

введите описание изображения здесь

Если вы также хотите дрожание, его также можно вручную добавить к обоим переменным x и y.

df = transform(df, dmeasure = ifelse(group == "ctr", 
                                     jitter(as.numeric(measure) - .25, .1),
                                     jitter(as.numeric(measure) + .25, .1) ),
               jvalue = jitter(value, amount = .1) )

ggplot(df, aes(x = measure, y = jvalue) ) +
     geom_blank() +
     geom_point( aes(x = dmeasure), shape = 1 ) +
     geom_line( aes(group = a, x = dmeasure) )

введите описание изображения здесь

person aosmith    schedule 20.06.2017
comment
Это именно то, что я искал. Ваше здоровье! - person tjebo; 20.06.2017