2017-02-22 40 views
2

Я пытаюсь использовать ggalluvial, чтобы отслеживать академические пути студентов в течение семестров и видеть, как студенты меняют учебную программу с течением времени.Как сопоставить индивидуальный путь к аллювиальной диаграмме?

Это образец моего набора данных:

structure(list(id = c("1", "2", "6", "8", "9", "10", "11", "12", 
"14", "15", "1", "2", "6", "8", "9", "10", "11", "12", "14", 
"15", "1", "2", "6", "8", "9", "10", "11", "12", "14", "15", 
"1", "2", "6", "8", "9", "10", "11", "12", "14", "15", "1", "2", 
"6", "8", "9", "10", "11", "12", "14", "15", "1", "2", "6", "8", 
"9", "10", "11", "12", "14", "15", "1", "2", "6", "8", "9", "10", 
"11", "12", "14", "15", "1", "2", "6", "8", "9", "10", "11", 
"12", "14", "15"), 
curr = c("CURR1", "CURR1", "CURR1", "CURR1", 
    "CURR1", "CURR1", "CURR1", "CURR1", "CURR1", "CURR1", "CURR3", 
    "CURR3", "CURR3", "CURR3", "CURR3", "CURR3", "CURR3", "CURR3", 
    "CURR3", "CURR3", "CURR5", "CURR5", "CURR5", "CURR5", "CURR5", 
    "CURR5", "CURR5", "CURR5", "CURR5", "CURR5", "CURR7", "CURR7", 
    "CURR7", "CURR7", "CURR7", "CURR7", "CURR7", "CURR7", "CURR7", 
    "CURR7", "CURR9", "CURR9", "CURR9", "CURR9", "CURR9", "CURR9", 
    "CURR9", "CURR9", "CURR9", "CURR9", "CURR11", "CURR11", "CURR11", 
    "CURR11", "CURR11", "CURR11", "CURR11", "CURR11", "CURR11", "CURR11", 
    "CURR13", "CURR13", "CURR13", "CURR13", "CURR13", "CURR13", "CURR13", 
    "CURR13", "CURR13", "CURR13", "CURR15", "CURR15", "CURR15", "CURR15", 
    "CURR15", "CURR15", "CURR15", "CURR15", "CURR15", "CURR15"), 
     value = c("ISDS", "ISDS", "GBUS", "ISDS", "GBUS", "ISDS", 
     "ACCT", "GBUS", "ITF", "MGT", "ISDS", "ISDS", "GBUS", "ISDS", 
     "MKT", "ISDS", "ACCT", "GBUS", "ITF", "MGT", "ISDS", "ISDS", 
     "ISDS", "ISDS", "MKT", "ISDS", "ACCT", "GBUS", "ISDS", "MGT", 
     "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ACCT", "GBUS", 
     "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", NA, "ISDS", "ISDS", 
     "ACCT", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", 
     "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", "ISDS", NA, 
     "ISDS", "ISDS", "ISDS", NA, "ISDS", "ISDS", "ISDS", "ISDS", 
     "ISDS", NA, "ISDS", "ISDS", "ISDS", NA, "ISDS", "ISDS", "ISDS", 
     NA)), class = "data.frame", row.names = c(NA, -80L), .Names = c("id", 
    "curr", "value")) 
  • ID = студент ID
  • ТОК = семестре идентификатор
  • значение = учебный план идентификатор

Я хотел бы карту :

  1. CURR (переменное время), к оси х

  2. value к различным высотам оси у

  3. отсчет value для каждого CURR к ширине потоков

Диаграмма должна содержать информацию, из которой/в какую учебную программу они «текут» со временем.

Это то, что я до сих пор, что является довольно от

ggplot(as.data.frame(ff2), 
     aes(x=curr, axis1=value, group=id)) + 
    geom_alluvium(aes(fill = value)) 

enter image description here

По оси х выглядит хорошо, но weight не отражает различные веса учебных планов с течением времени, ни I может следовать «потокам» студентов.

+0

Мое первое предложение - заказать переменные. Измените CURR на числовую или, по крайней мере, буквенно-упорядоченную строку. 'ff2 $ curr <- as.numeric (gsub (" CURR "," ", ff2 $ curr))' Что касается значения, я не совсем уверен, что вы подразумеваете под ростом оси y , – jesstme

+0

@jesstme Я хотел бы иметь название учебной программы по оси y. Что касается заказа, я могу использовать 'order', но это не решает проблему. – Dambo

ответ

2

Извините за задержку. Я просто объединил экспериментальную ветку, включающую отдельную геометрию для построения «потоков» между осями вместо полной «аллювии», охватывающей всю диаграмму, плюс множество новых параметров. Это делает вид сюжета, который вы описываете, используя следующий код, при условии, что ff2 назначен вызов structure() в OP.

# keep the values of 'curr' in their proper order 
ff2$curr <- factor(ff2$curr, levels = unique(ff2$curr)) 
ggplot(ff2, aes(
    # position aesthetics: 
    # 'x' as in 'geom_bar()' 
    # 'stratum' and 'alluvium' specific to ggalluvial 
    x = curr, stratum = value, alluvium = id, 
    # apply 'fill' colors to both flows and strata 
    fill = value 
)) + 
    # flow parameters: 
    # 'lode.guidance' says how to arrange splines in each stratum 
    # 'aes.flow' says which axis determines flow aesthetics 
    geom_flow(lode.guidance = "rightleft", aes.flow = "forward") + 
    geom_stratum() + 
    # include text labels at each stratum 
    geom_text(stat = "stratum") 

Спасибо за указание это необходимость, особенно для обработки NA сек последовательным образом!

0

Попробуйте следующее. Это не великолепно, но это работает. Вы можете использовать базовую графику, чтобы немного почистить ее.

Установите следующие пакеты, если вы еще не сделали, а затем загрузить их:

library(alluvial) 
library(tidyr) 

редактировать свои данные:

ff2$value[is.na(ff2$value)] <- "None" # Replace NAs with a category so they're not lost 
ff2$curr <- as.numeric(substr(ff2$curr, 5, nchar(ff2$curr))) # Change your term labels to numeric for easy & correct ordering 
ff3 <- spread(ff2, curr, value, fill = "None") #spread your df from long to wide format 

цвета диаграммы с помощью студента, для облегчения отслеживания с течением времени:

cl <- colors(distinct = TRUE) 
color_palette <- sample(cl, length(ff3$id)) 

Участок:

alluvial(ff3[,2:9], 
     freq = 8, 
     col = color_palette, 
     blocks = T, 
     xw = 0.2,# makes the ribbons a bit wavier 
     axis_labels = c("Term1","Term2", "Term3","Term4","Term5","Term6", "Term7","Term8"))