Сортировать тему по критерию и добавлять заметки вне графика - PullRequest
1 голос
/ 25 сентября 2019

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

  • Повод: Число сеансов, оценивающих поведение, оценивающих поведение (от 1 до n);
  • Время: номер каждого условия (базовый уровень от 1 до n и интервал от 1 до n);
  • Фаза: Состояние (A = базовый уровень или B = вмешательство);
  • ID: код студента в исследовании;
  • Результат: общий балл по поведенческому контрольному списку.
library(dplyr)
library(ggplot2)

db_tb <- read.table(header = TRUE, text = '
Occasion Time Phase ID outcome
      1    1     A  1       15
      2    2     A  1       14
      3    3     A  1        8
      4    4     A  1       10
      5    5     A  1       14
      6    6     A  1        8
      7    7     A  1       10
      8    1     B  1       21
      9    2     B  1       23
     10    3     B  1       24
     11    4     B  1       20
     12    5     B  1       25
     13    6     B  1       15
     14    7     B  1       11
     15    8     B  1       23
     16    9     B  1       20
     17   10     B  1       NA
     18   11     B  1       15
     19   12     B  1       20
     20   13     B  1       NA
     21   14     B  1       16
      1    1     A  2       18
      2    2     A  2       14
      3    3     A  2       18
      4    4     A  2       21
      5    1     B  2        8
      6    2     B  2       NA
      7    3     B  2       10
      8    4     B  2       17
      9    5     B  2       NA
     10    6     B  2       29
      1    1     A  3       15
      2    2     A  3        7
      3    3     A  3       14
      4    1     B  3       15
      5    2     B  3       14
      6    3     B  3       11
      7    4     B  3       10
      8    5     B  3       NA
      9    6     B  3       NA
      10   7     B  3        7
      11   8     B  3        9
      12   9     B  3       13
      13  10     B  3       11
')

Чтобы разделить базовую линию и вмешательство, я создал vlines_tb, который дает мне таблицу с номером сеанса, после которогоЯ установлю вертикальную линию в ggplot2.

#table containing the last day of the baseline phase
vlines_tb <- db_tb %>% 
  filter(Phase == "A") %>% 
  group_by(ID, Phase) %>%
  summarise(y = max(Occasion))

Наконец, я создал график в соответствии с другими работами в этой области.

#create a visual representation
db_tb %>% 
  na.omit(outcome) %>%  #Interpolate missing data so all markers within phase are connected 
  ggplot(aes(x = Occasion, y = outcome, group = Phase)) + 
  geom_point(size = 1.8) + 
  geom_line(size = 0.65) +
  ggtitle("Baseline") +
  facet_grid(ID ~ .) +
  scale_x_continuous(name = "Occasions", breaks = seq(0, 70, 5)) +
  scale_y_continuous(name = "Rating", limits = c(0, 30)) +
  theme_classic() +
  theme(strip.background = element_blank(),
        axis.title.x = element_text(margin = margin(t = 20, r = 0, b = 0, l = 0)),
        axis.title.y = element_text(margin = margin(t = 0, r = 20, b = 0, l = 0))) +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf) +
  geom_vline(data = vlines_tb, aes(xintercept = y + 0.5), colour = "black", linetype = "dashed")

enter image description here

Однако я хотел бы внести пару изменений:

  • Сортировать предметы покогда вмешательство было осуществлено так, чтобы субъектом на первом месте был тот, кто получил вмешательство первым и т. д .;и
  • Перемаркируйте идентификаторы так, чтобы первый из верхних, представленных на графике, был переименован в 1 и т. д .;
  • Обозначьте базовую линию и условия вмешательства в верхней части диаграммы(они должны быть выше двух соответствующих областей).

Я внес изменения в Excel, чтобы показать, как должен выглядеть окончательный результат (см. ниже).Спасибо за любую помощь!enter image description here

1 Ответ

1 голос
/ 27 сентября 2019

Посмотрите, работает ли это для вас.Пояснения в аннотациях:

db_tb %>%
  na.omit(outcome) %>%

  # calculate the interventing timing for each ID
  group_by(ID) %>%
  mutate(intervention.timing = max(Occasion[Phase == "A"])) %>%
  ungroup() %>% 

  # convert IDs to factors ordered according to their intervention timing
  mutate(ID = forcats::fct_reorder(factor(ID), intervention.timing)) %>%

  # create new IDs based on order of original ID's levels
  mutate(new.ID = as.integer(ID)) %>%

  # define label position for each ID
  group_by(ID, Phase) %>%
  mutate(label.x = mean(Occasion)) %>%
  ungroup() %>%
  mutate(label = ifelse(Phase == "A", "Baseline", "Intervention"), 
         label.y = max(outcome)) %>%

  ggplot(aes(x = Occasion, y = outcome)) +
  geom_point(size = 1.8) + 
  geom_line(aes(group = Phase), 
            size = 0.65) +
  geom_vline(data = . %>% select(new.ID, intervention.timing) %>% unique(),
             aes(xintercept = intervention.timing + 0.5),
             linetype = "dashed") +
  # only show phase label in top facet
  geom_text(data = . %>% select(new.ID, Phase, label.x, label.y, label) %>% unique(),
            aes(x = label.x, y = label.y, label = label,
                alpha = ifelse(new.ID == min(new.ID), 1, 0)),
            vjust = 1, fontface = "bold") +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf) +

  facet_grid(new.ID ~ .) +
  scale_x_continuous(name = "Occasions", breaks = seq(0, 70, 5)) +
  scale_y_continuous(name = "Rating", limits = c(0, 30)) +
  scale_alpha_identity() +
  theme_classic() +
  theme(strip.background = element_blank())

result

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