Создать параллельно-координатный график относительно количества вхождений в r - PullRequest
0 голосов
/ 27 ноября 2018

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

ID  term  subject  result
1    1     math01    fail
1    1     Phys01    pass
1    1     chem01    pass
1    2     math01    pass
1    2     math02    fail
1    3     math02    fail
1    3     cmp01     pass
2    1     math01    fail
2    1     phys01    pass
2    2     math01    pass
2    2     math02    pass
2    3     cmp01     pass

желаемый результат будет аналогичен изображению ниже.
Каждый блок в каждом члене показывает полученный псевдоним субъекта с resultстолбец (сбой или пропуск).Размер блока должен соответствовать номеру взятого предмета.например, если большинство учащихся проваливают math01 в первом семестре, блок math01fail должен быть самым большим в нижнем семестре1.

Соединительная линия соединяет те предметы, которые студенты изучали в семестре, со следующим семестром.Толщина линии соответствует количеству соединений в этой точке.Например, если многие учащиеся потерпели неудачу в математике 01 (math01fail) в семестре 1, а затем повторно взяли математику 01 в семестре 2 и передали ее (math01pass), соединительная линия между math01fail и math01pass должна быть более толстой в зависимости от количества вхождений.

Как я могу создать такой сюжет в R?enter image description here

1 Ответ

0 голосов
/ 28 ноября 2018

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

Вот что я бы сделал:

  1. Начните с загрузки необходимых библиотек

    library(tidyverse)
    library(igraph)
    
  2. Сначала мы определим список ребер нашего графа.Для этого мы выполняем самостоятельное объединение df на ID и выбираем строки, которые соответствуют последовательным (возрастающим) терминам.Каждая строка соответствует ссылке от термина i до i + 1 для каждого студента.

    el <- left_join(df, df, by = "ID") %>%
        filter(term.x == term.y - 1) %>%
        mutate_at(vars(starts_with("term")), funs(paste0("term", .))) %>%
        unite(from, term.x, subject.x, result.x, sep = "\n") %>%
        unite(to, term.y, subject.y, result.y, sep = "\n") %>%
        select(from, to) %>%
        group_by(from, to) %>%
        summarise(weight = (n() - 1) * 5 + 1)
    

    Мы добавляем весовой столбец, пропорциональный количеству студентов для каждого ребра.Причина, по которой мы просто не делаем weight = n(), заключается исключительно в эстетике, где мы хотели бы иметь более толстые линии для> 1 студента.

  3. Далее мы определяем список узлов.Ключевым моментом здесь является добавление столбцов x и y, которые будут определять расположение сетки узлов.

    nl <- df %>%
        mutate(term = paste0("term", term)) %>%
        arrange(term) %>%
        distinct(term, subject, result) %>%
        mutate(x = as.integer(as.factor(term))) %>%
        group_by(term) %>%
        mutate(y = 1:n()) %>%
        unite(node, term, subject, result, sep = "\n")
    

    Обратите внимание, что записи в первом столбце nl должны совпадать с записями в первомдва столбца el.

  4. Теперь мы готовы построить igraph из обоих data.frame с и построить график.

    gr <- graph_from_data_frame(d = el, vertices = nl, directed = F)
    plot(
        gr,
        edge.width = E(gr)$weight,
        vertex.shape = "rectangle",
        vertex.size = 50, vertex.size2 = 50,
        vertex.color = "white",
        vertex.label.family = "sans",
        vertex.label.cex = 0.7)
    

    enter image description here

    Получившийся график может нуждаться в дальнейшей доработке / полировке, но с этого следует начать.

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