Заставьте facet_grid отображать фасеты в том же порядке, в котором они отображаются в наборе данных. - PullRequest
0 голосов
/ 30 сентября 2019

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

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

Случаи упорядочены на основе критерия (т. Е. Первогосеанс вмешательства) в наборе данных. К сожалению, когда я создал различные фасеты с ggplot2::facet_grid, ящики отсортированы по их количеству, и я получил то, что вы можете видеть на изображении ниже. Я пытался изменить тип переменной (от целого к фактору, от фактора к символу и т. Д.), Но ничего не изменилось. Наконец, я не могу заказать фасеты вручную, потому что реальный набор данных состоит из еще нескольких случаев.

outcome <- c(4, 8, 10, NA, 15, 7, 7, 9, 14, NA, 16, 4, 3, 2, 2, 7, 7, 9, 14, NA, 3, 6, 6, NA, 5, 9, 11, NA, 6, 3, 4, 8, 7, NA, NA, 3)
Phase <- c("A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "A", "A", "A", "B", "B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B", "B")
Time <- c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 5)
Occasion <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 9)
ID <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2)


db <- data.frame(ID, Occasion, Time, Phase, outcome)

intervention_lines <- db %>% 
  filter(Phase == "A") %>% 
  group_by(ID, Phase) %>%
  summarise(y = max(Occasion)) 

db %>% na.omit(outcome) %>% 
  ggplot(aes(x = Occasion, y = outcome, group = Phase)) + 
  geom_point(size = 1.8) + 
  geom_line(size = 0.65) +
  facet_grid(ID ~ .) +
  scale_x_continuous(name = "y", breaks = seq(0, 11, 1)) +
  scale_y_continuous(name = "x", limits = c(0, 30)) +
  theme_classic() +
  theme(strip.background = element_blank()) +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf) +
  geom_vline(data = intervention_lines, aes(xintercept = y + 0.5), colour = "black", linetype = "dashed")

enter image description here

1 Ответ

2 голосов
/ 30 сентября 2019

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

Я сделал это путем преобразования идентификатора в коэффициент и последующего упорядочения. это на intervention_lines$y в обоих местах.

library(forcats)
intervention_lines <- db %>% 
  filter(Phase == "A") %>% 
  group_by(ID, Phase) %>%
  summarise(y = max(Occasion)) %>%
  ungroup() %>%
  mutate(ID = ID %>% as_factor() %>% fct_reorder(y))

db %>% na.omit(outcome) %>% 
  mutate(ID = as_factor(ID)) %>%
  left_join(intervention_lines %>% select(ID, y)) %>%
  mutate(ID = ID %>% fct_reorder(y)) %>% 
  ggplot(aes(x = Occasion, y = outcome, group = Phase)) + 
  geom_point(size = 1.8) + 
  geom_line(size = 0.65) +
  scale_x_continuous(name = "y", breaks = seq(0, 11, 1)) +
  scale_y_continuous(name = "x", limits = c(0, 30)) +
  theme_classic() +
  theme(strip.background = element_blank()) +
  annotate("segment", x = -Inf, xend = Inf, y = -Inf, yend = -Inf) +
  geom_vline(data = intervention_lines, aes(xintercept = y + 0.5), colour = "black", linetype = "dashed") +
  facet_grid(ID~.)

enter image description here

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